From 1ab8555a94ec128e7f8f9dd172c96e7d375ebce4 Mon Sep 17 00:00:00 2001 From: Zhuoxun Yang Date: Wed, 18 Oct 2023 22:50:43 +0800 Subject: [PATCH 1/3] pathchk: check empty path --- src/uu/pathchk/src/pathchk.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/uu/pathchk/src/pathchk.rs b/src/uu/pathchk/src/pathchk.rs index 3510a3327b..81c3520886 100644 --- a/src/uu/pathchk/src/pathchk.rs +++ b/src/uu/pathchk/src/pathchk.rs @@ -193,6 +193,17 @@ fn check_default(path: &[String]) -> bool { ); return false; } + if total_len == 0 { + // Check whether a file name component is in a directory that is not searchable, + // or has some other serious problem. POSIX does not allow "" as a file name, + // but some non-POSIX hosts do (as an alias for "."), + // so allow "" if `symlink_metadata` (corresponds to `lstat`) does. + if fs::symlink_metadata(&joined_path).is_err() { + writeln!(std::io::stderr(), "pathchk: '': No such file or directory",); + return false; + } + } + // components: length for p in path { let component_len = p.len(); From f63f9a06f62340ded772fac93e732af80e534208 Mon Sep 17 00:00:00 2001 From: Zhuoxun Yang Date: Wed, 18 Oct 2023 22:50:54 +0800 Subject: [PATCH 2/3] tests/pathchk: test empty path --- tests/by-util/test_pathchk.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/by-util/test_pathchk.rs b/tests/by-util/test_pathchk.rs index f497cfe898..e1f4bc539b 100644 --- a/tests/by-util/test_pathchk.rs +++ b/tests/by-util/test_pathchk.rs @@ -19,8 +19,10 @@ fn test_default_mode() { // accept non-portable chars new_ucmd!().args(&["dir#/$file"]).succeeds().no_stdout(); - // accept empty path - new_ucmd!().args(&[""]).succeeds().no_stdout(); + // fail on empty path + new_ucmd!().args(&[""]).fails().no_stdout(); + + new_ucmd!().args(&["", ""]).fails().no_stdout(); // fail on long path new_ucmd!() From 44240915921214c1027a0520487a8af85d3ba67e Mon Sep 17 00:00:00 2001 From: Zhuoxun Yang Date: Thu, 19 Oct 2023 01:29:53 +0800 Subject: [PATCH 3/3] tests/pathchk: check error message --- tests/by-util/test_pathchk.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/by-util/test_pathchk.rs b/tests/by-util/test_pathchk.rs index e1f4bc539b..d66ecb9efb 100644 --- a/tests/by-util/test_pathchk.rs +++ b/tests/by-util/test_pathchk.rs @@ -20,9 +20,15 @@ fn test_default_mode() { new_ucmd!().args(&["dir#/$file"]).succeeds().no_stdout(); // fail on empty path - new_ucmd!().args(&[""]).fails().no_stdout(); + new_ucmd!() + .args(&[""]) + .fails() + .stderr_only("pathchk: '': No such file or directory\n"); - new_ucmd!().args(&["", ""]).fails().no_stdout(); + new_ucmd!().args(&["", ""]).fails().stderr_only( + "pathchk: '': No such file or directory\n\ + pathchk: '': No such file or directory\n", + ); // fail on long path new_ucmd!()