mirror of
https://github.com/uutils/coreutils.git
synced 2026-06-10 15:48:22 -07:00
cp: fail when trying to copy to read only file on mac (#5261)
* cp: fail when trying to copy to read only file * fix spelling error in macos.rs * simplify permissions check * add comment * fix typo
This commit is contained in:
@@ -63,8 +63,15 @@ pub(crate) fn copy_on_write(
|
|||||||
{
|
{
|
||||||
// clonefile(2) fails if the destination exists. Remove it and try again. Do not
|
// clonefile(2) fails if the destination exists. Remove it and try again. Do not
|
||||||
// bother to check if removal worked because we're going to try to clone again.
|
// bother to check if removal worked because we're going to try to clone again.
|
||||||
let _ = fs::remove_file(dest);
|
// first lets make sure the dest file is not read only
|
||||||
error = pfn(src.as_ptr(), dst.as_ptr(), 0);
|
if fs::metadata(dest).map_or(false, |md| !md.permissions().readonly()) {
|
||||||
|
// remove and copy again
|
||||||
|
// TODO: rewrite this to better match linux behavior
|
||||||
|
// linux first opens the source file and destination file then uses the file
|
||||||
|
// descriptors to do the clone.
|
||||||
|
let _ = fs::remove_file(dest);
|
||||||
|
error = pfn(src.as_ptr(), dst.as_ptr(), 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3440,3 +3440,19 @@ fn test_cp_only_source_no_target() {
|
|||||||
panic!("Failure: stderr was \n{stderr_str}");
|
panic!("Failure: stderr was \n{stderr_str}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_cp_dest_no_permissions() {
|
||||||
|
let ts = TestScenario::new(util_name!());
|
||||||
|
let at = &ts.fixtures;
|
||||||
|
|
||||||
|
at.touch("valid.txt");
|
||||||
|
at.touch("invalid_perms.txt");
|
||||||
|
at.set_readonly("invalid_perms.txt");
|
||||||
|
|
||||||
|
ts.ucmd()
|
||||||
|
.args(&["valid.txt", "invalid_perms.txt"])
|
||||||
|
.fails()
|
||||||
|
.stderr_contains("invalid_perms.txt")
|
||||||
|
.stderr_contains("denied");
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user