1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-27 19:17:43 +00:00

Don't panic when calling cp -a with a nonexistent file

This commit is contained in:
Eli Youngs 2022-01-29 22:59:53 -08:00
parent 5dd7d13cbd
commit 680e9081fe
2 changed files with 16 additions and 4 deletions

View file

@ -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(),

View file

@ -26,6 +26,7 @@ use std::thread::sleep;
use std::time::Duration; use std::time::Duration;
static TEST_EXISTING_FILE: &str = "existing_file.txt"; static TEST_EXISTING_FILE: &str = "existing_file.txt";
static TEST_NONEXISTENT_FILE: &str = "nonexistent_file.txt";
static TEST_HELLO_WORLD_SOURCE: &str = "hello_world.txt"; static TEST_HELLO_WORLD_SOURCE: &str = "hello_world.txt";
static TEST_HELLO_WORLD_SOURCE_SYMLINK: &str = "hello_world.txt.link"; static TEST_HELLO_WORLD_SOURCE_SYMLINK: &str = "hello_world.txt.link";
static TEST_HELLO_WORLD_DEST: &str = "copy_of_hello_world.txt"; static TEST_HELLO_WORLD_DEST: &str = "copy_of_hello_world.txt";
@ -1429,3 +1430,14 @@ 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)");
}