From 9697c89d174e896f5454a233e570916cbfa9b2ff Mon Sep 17 00:00:00 2001 From: Michael Debertol Date: Mon, 16 Aug 2021 00:30:25 +0200 Subject: [PATCH] uucore/mode: handle mode 0 Trimming all '0' characters results in an invalid string if the string contained only '0's. --- src/uucore/src/lib/features/mode.rs | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/uucore/src/lib/features/mode.rs b/src/uucore/src/lib/features/mode.rs index 8e9f063ff..eb5bfc580 100644 --- a/src/uucore/src/lib/features/mode.rs +++ b/src/uucore/src/lib/features/mode.rs @@ -11,19 +11,21 @@ use libc::{mode_t, S_IRGRP, S_IROTH, S_IRUSR, S_IWGRP, S_IWOTH, S_IWUSR}; pub fn parse_numeric(fperm: u32, mut mode: &str) -> Result { let (op, pos) = parse_op(mode, Some('='))?; - mode = mode[pos..].trim().trim_start_matches('0'); - if mode.len() > 4 { - Err(format!("mode is too large ({} > 7777)", mode)) - } else { - match u32::from_str_radix(mode, 8) { - Ok(change) => Ok(match op { - '+' => fperm | change, - '-' => fperm & !change, - '=' => change, - _ => unreachable!(), - }), - Err(err) => Err(err.to_string()), + mode = mode[pos..].trim(); + match u32::from_str_radix(mode, 8) { + Ok(change) => { + if change > 0o7777 { + Err(format!("mode is too large ({} > 7777", mode)) + } else { + Ok(match op { + '+' => fperm | change, + '-' => fperm & !change, + '=' => change, + _ => unreachable!(), + }) + } } + Err(err) => Err(err.to_string()), } }