diff --git a/src/uu/cp/src/cp.rs b/src/uu/cp/src/cp.rs index ef8fb93ec3b..4772a642472 100644 --- a/src/uu/cp/src/cp.rs +++ b/src/uu/cp/src/cp.rs @@ -1092,7 +1092,7 @@ fn copy_directory( return Err(format!( "cannot copy a directory, {}, into itself, {}", root.quote(), - target.quote() + target.join(root.file_name().unwrap()).quote() ) .into()); } diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index 45b33157663..94bf17026d3 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -2095,3 +2095,31 @@ fn test_cp_mode_hardlink_no_dereference() { assert!(at.symlink_exists("z")); assert_eq!(at.read_symlink("z"), "slink"); } + +/// Test that copying a directory to itself is disallowed. +#[test] +fn test_copy_directory_to_itself_disallowed() { + let (at, mut ucmd) = at_and_ucmd!(); + at.mkdir("d"); + #[cfg(not(windows))] + let expected = "cp: cannot copy a directory, 'd', into itself, 'd/d'"; + #[cfg(windows)] + let expected = "cp: cannot copy a directory, 'd', into itself, 'd\\d'"; + ucmd.args(&["-R", "d", "d"]).fails().stderr_only(expected); +} + +/// Test that copying a nested directory to itself is disallowed. +#[test] +fn test_copy_nested_directory_to_itself_disallowed() { + let (at, mut ucmd) = at_and_ucmd!(); + at.mkdir("a"); + at.mkdir("a/b"); + at.mkdir("a/b/c"); + #[cfg(not(windows))] + let expected = "cp: cannot copy a directory, 'a/b', into itself, 'a/b/c/b'"; + #[cfg(windows)] + let expected = "cp: cannot copy a directory, 'a/b', into itself, 'a/b/c\\b'"; + ucmd.args(&["-R", "a/b", "a/b/c"]) + .fails() + .stderr_only(expected); +}