mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-27 11:07:44 +00:00
Merge pull request #2960 from water-ghosts/fix-cp-a-panic
Don't panic when calling cp -a with a nonexistent file
This commit is contained in:
commit
81b2a240e6
2 changed files with 19 additions and 4 deletions
|
@ -768,8 +768,8 @@ fn preserve_hardlinks(
|
||||||
let mut stat = mem::zeroed();
|
let mut stat = mem::zeroed();
|
||||||
if libc::lstat(src_path.as_ptr(), &mut stat) < 0 {
|
if libc::lstat(src_path.as_ptr(), &mut stat) < 0 {
|
||||||
return Err(format!(
|
return Err(format!(
|
||||||
"cannot stat {:?}: {}",
|
"cannot stat {}: {}",
|
||||||
src_path,
|
source.quote(),
|
||||||
std::io::Error::last_os_error()
|
std::io::Error::last_os_error()
|
||||||
)
|
)
|
||||||
.into());
|
.into());
|
||||||
|
@ -849,7 +849,7 @@ fn copy(sources: &[Source], target: &TargetSlice, options: &Options) -> CopyResu
|
||||||
let mut found_hard_link = false;
|
let mut found_hard_link = false;
|
||||||
if preserve_hard_links {
|
if preserve_hard_links {
|
||||||
let dest = construct_dest_path(source, target, &target_type, options)?;
|
let dest = construct_dest_path(source, target, &target_type, options)?;
|
||||||
preserve_hardlinks(&mut hard_links, source, dest, &mut found_hard_link).unwrap();
|
preserve_hardlinks(&mut hard_links, source, dest, &mut found_hard_link)?;
|
||||||
}
|
}
|
||||||
if !found_hard_link {
|
if !found_hard_link {
|
||||||
if let Err(error) =
|
if let Err(error) =
|
||||||
|
@ -1031,7 +1031,7 @@ fn copy_directory(
|
||||||
let mut found_hard_link = false;
|
let mut found_hard_link = false;
|
||||||
let source = path.to_path_buf();
|
let source = path.to_path_buf();
|
||||||
let dest = local_to_target.as_path().to_path_buf();
|
let dest = local_to_target.as_path().to_path_buf();
|
||||||
preserve_hardlinks(&mut hard_links, &source, dest, &mut found_hard_link).unwrap();
|
preserve_hardlinks(&mut hard_links, &source, dest, &mut found_hard_link)?;
|
||||||
if !found_hard_link {
|
if !found_hard_link {
|
||||||
match copy_file(
|
match copy_file(
|
||||||
path.as_path(),
|
path.as_path(),
|
||||||
|
|
|
@ -43,6 +43,8 @@ static TEST_MOUNT_COPY_FROM_FOLDER: &str = "dir_with_mount";
|
||||||
static TEST_MOUNT_MOUNTPOINT: &str = "mount";
|
static TEST_MOUNT_MOUNTPOINT: &str = "mount";
|
||||||
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
|
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
|
||||||
static TEST_MOUNT_OTHER_FILESYSTEM_FILE: &str = "mount/DO_NOT_copy_me.txt";
|
static TEST_MOUNT_OTHER_FILESYSTEM_FILE: &str = "mount/DO_NOT_copy_me.txt";
|
||||||
|
#[cfg(unix)]
|
||||||
|
static TEST_NONEXISTENT_FILE: &str = "nonexistent_file.txt";
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_cp_cp() {
|
fn test_cp_cp() {
|
||||||
|
@ -1429,3 +1431,16 @@ fn test_copy_through_dangling_symlink() {
|
||||||
.fails()
|
.fails()
|
||||||
.stderr_only("cp: not writing through dangling symlink 'target'");
|
.stderr_only("cp: not writing through dangling symlink 'target'");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg(unix)]
|
||||||
|
fn test_cp_archive_on_nonexistent_file() {
|
||||||
|
new_ucmd!()
|
||||||
|
.arg("-a")
|
||||||
|
.arg(TEST_NONEXISTENT_FILE)
|
||||||
|
.arg(TEST_EXISTING_FILE)
|
||||||
|
.fails()
|
||||||
|
.stderr_only(
|
||||||
|
"cp: cannot stat 'nonexistent_file.txt': No such file or directory (os error 2)",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue