Avoid throwing error if chmod a symlink

It is possible that we want to clone attributes of a regular file to a
symlink. In this case, we don't need to error out if chmod fails. Just
skip it.
This commit is contained in:
Wang Han 2025-06-05 12:53:01 +08:00 committed by John Wu
parent 48d9fc24eb
commit 0b494ed7df

View File

@ -326,11 +326,12 @@ impl Utf8CStr {
pub fn set_attr<'a>(&'a self, attr: &'a FileAttr) -> OsResult<'a, ()> {
unsafe {
if !attr.is_symlink() {
libc::chmod(self.as_ptr(), (attr.st.st_mode & 0o777).as_()).check_os_err(
"chmod",
Some(self),
None,
)?;
if libc::chmod(self.as_ptr(), (attr.st.st_mode & 0o777).as_()) < 0 {
let self_attr = self.get_attr()?;
if !self_attr.is_symlink() {
return Err(OsError::last_os_error("chmod", Some(self), None));
}
}
}
libc::lchown(self.as_ptr(), attr.st.st_uid, attr.st.st_gid).check_os_err(
"lchown",