diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index 868c35f2d..d18edbc10 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -35,7 +35,6 @@ use std::ffi::CString; #[cfg(windows)] use std::ffi::OsStr; use std::fs; -#[cfg(target_os = "linux")] use std::fs::File; use std::fs::OpenOptions; use std::io; @@ -1233,7 +1232,14 @@ fn copy_helper(source: &Path, dest: &Path, options: &Options) -> CopyResult<()> }; symlink_file(&link, &dest, &*context_for(&link, &dest))?; } else { - fs::copy(source, dest).context(&*context_for(source, dest))?; + if source.to_string_lossy() == "/dev/null" { + /* workaround a limitation of fs::copy + * https://github.com/rust-lang/rust/issues/79390 + */ + File::create(dest)?; + } else { + fs::copy(source, dest).context(&*context_for(source, dest))?; + } } Ok(()) diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index 9210e7d17..ccab0134b 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -911,14 +911,8 @@ fn test_cp_target_file_dev_null() { let file1 = "/dev/null"; let file2 = "test_cp_target_file_file_i2"; - at.touch(file1); at.touch(file2); - ucmd.arg(file1).arg(file2).fails(); - - /* Uncomment when fixed ucmd.arg(file1).arg(file2).succeeds().no_stderr(); - assert!(at.file_exists(file1)); assert!(at.file_exists(file2)); - */ }