From 9f1ac221cd245d2b1db8d60bdc26fe9658cea169 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Tue, 25 Oct 2022 00:29:49 +0200 Subject: [PATCH] chown: fails when XXXX. or XXXX: is provided (when XXXX is numeric values) If the arg starts with an id numeric value, the group isn't set but the separator is provided, we should fail with an error Should fix tests/chown/separator.sh --- src/uu/chown/src/chown.rs | 13 +++++++++++++ tests/by-util/test_chown.rs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/uu/chown/src/chown.rs b/src/uu/chown/src/chown.rs index d99516d92..f434faaa7 100644 --- a/src/uu/chown/src/chown.rs +++ b/src/uu/chown/src/chown.rs @@ -246,6 +246,19 @@ fn parse_spec(spec: &str, sep: char) -> UResult<(Option, Option)> { } else { None }; + + if user.chars().next().map(char::is_numeric).unwrap_or(false) + && group.is_empty() + && spec != user + { + // if the arg starts with an id numeric value, the group isn't set but the separator is provided, + // we should fail with an error + return Err(USimpleError::new( + 1, + format!("invalid spec: {}", spec.quote()), + )); + } + Ok((uid, gid)) } diff --git a/tests/by-util/test_chown.rs b/tests/by-util/test_chown.rs index b54412857..c786afa8e 100644 --- a/tests/by-util/test_chown.rs +++ b/tests/by-util/test_chown.rs @@ -423,6 +423,38 @@ fn test_chown_only_user_id() { .stderr_contains("failed to change"); } +#[test] +fn test_chown_fail_id() { + // test chown 1111. file.txt + + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + + let result = scene.cmd_keepenv("id").arg("-u").run(); + if skipping_test_is_okay(&result, "id: cannot find name for group ID") { + return; + } + let user_id = String::from(result.stdout_str().trim()); + assert!(!user_id.is_empty()); + + let file1 = "test_chown_file1"; + at.touch(file1); + + scene + .ucmd() + .arg(format!("{}:", user_id)) + .arg(file1) + .fails() + .stderr_contains("invalid spec"); + + scene + .ucmd() + .arg(format!("{}.", user_id)) + .arg(file1) + .fails() + .stderr_contains("invalid spec"); +} + /// Test for setting the owner to a user ID for a user that does not exist. /// /// For example: