From eb80f06557d3a84f404d0075ab2372204fee95fb Mon Sep 17 00:00:00 2001 From: Jay Hemnani <193022578+jayhemnani9910@users.noreply.github.com> Date: Tue, 20 Oct 2026 04:39:11 +0530 Subject: [PATCH 1/2] pmap: accept a 0x prefix in --range addresses -A/--range only took bare hex digits, so "pmap -A 0x7f0000000000, PID" failed with "failed to parse argument", while procps-ng pmap takes the addresses with or without 0x (or 0X). Strip the prefix before parsing. --- src/uu/pmap/src/pmap.rs | 16 +++++++++++++--- tests/by-util/test_pmap.rs | 9 +++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/uu/pmap/src/pmap.rs b/src/uu/pmap/src/pmap.rs index 20011348..2ac317c6 100644 --- a/src/uu/pmap/src/pmap.rs +++ b/src/uu/pmap/src/pmap.rs @@ -99,7 +99,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { if let Some(range) = matches.get_one::(options::RANGE) { match range.matches(',').count() { 0 => { - let address = u64::from_str_radix(range, 16).map_err(|_| { + let address = parse_address(range).map_err(|_| { USimpleError::new(1, format!("failed to parse argument: '{range}'")) })?; pmap_config.range_low = address; @@ -112,14 +112,14 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pmap_config.range_low = if low.is_empty() { 0 } else { - u64::from_str_radix(low, 16).map_err(|_| { + parse_address(low).map_err(|_| { USimpleError::new(1, format!("failed to parse argument: '{range}'")) })? }; pmap_config.range_high = if high.is_empty() { u64::MAX } else { - u64::from_str_radix(high, 16).map_err(|_| { + parse_address(high).map_err(|_| { USimpleError::new(1, format!("failed to parse argument: '{range}'")) })? }; @@ -433,6 +433,16 @@ fn output_device_format(pid: &str, pmap_config: &PmapConfig) -> Result<(), Error Ok(()) } +/// Parse an address for --range: hexadecimal, with or without a 0x prefix, +/// as procps-ng takes it. +fn parse_address(address: &str) -> Result { + let digits = address + .strip_prefix("0x") + .or_else(|| address.strip_prefix("0X")) + .unwrap_or(address); + u64::from_str_radix(digits, 16) +} + pub fn uu_app() -> Command { Command::new(env!("CARGO_PKG_NAME")) .version(crate_version!()) diff --git a/tests/by-util/test_pmap.rs b/tests/by-util/test_pmap.rs index 43d49d13..b4d55b29 100644 --- a/tests/by-util/test_pmap.rs +++ b/tests/by-util/test_pmap.rs @@ -375,6 +375,11 @@ fn test_range_arg() { "ffffffffffffffff,", ",ffffffffffffffff", "ffffffffffffffff,ffffffffffffffff", + // 0x prefix + "0xc00fee", + "0Xc00fee", + "0xc00,0xfee", + ",0xffffffffffffffff", ] { new_ucmd!().arg(&pid_s).arg(opt).arg(arg).succeeds(); } @@ -397,6 +402,10 @@ fn test_range_arg() { "someinvalidtext,", ",someinvalidtext", "someinvalidtext,someinvalidtext", + // 0x prefix without digits + "0x", + "0x,", + "0x0xc00fee", // too large value (> u64) "f0000000000000000", "f0000000000000000,f0000000000000000", From 2e673d21c63d0ad651e0530646a64b6d815560b2 Mon Sep 17 00:00:00 2001 From: Jay Hemnani <193022578+jayhemnani9910@users.noreply.github.com> Date: Sun, 25 Oct 2026 13:09:36 +0530 Subject: [PATCH 2/2] pmap: return the parse error from parse_address --- src/uu/pmap/src/pmap.rs | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/uu/pmap/src/pmap.rs b/src/uu/pmap/src/pmap.rs index 2ac317c6..93c133f1 100644 --- a/src/uu/pmap/src/pmap.rs +++ b/src/uu/pmap/src/pmap.rs @@ -99,9 +99,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { if let Some(range) = matches.get_one::(options::RANGE) { match range.matches(',').count() { 0 => { - let address = parse_address(range).map_err(|_| { - USimpleError::new(1, format!("failed to parse argument: '{range}'")) - })?; + let address = parse_address(range, range)?; pmap_config.range_low = address; pmap_config.range_high = address; } @@ -112,16 +110,12 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { pmap_config.range_low = if low.is_empty() { 0 } else { - parse_address(low).map_err(|_| { - USimpleError::new(1, format!("failed to parse argument: '{range}'")) - })? + parse_address(low, range)? }; pmap_config.range_high = if high.is_empty() { u64::MAX } else { - parse_address(high).map_err(|_| { - USimpleError::new(1, format!("failed to parse argument: '{range}'")) - })? + parse_address(high, range)? }; } _ => { @@ -434,13 +428,14 @@ fn output_device_format(pid: &str, pmap_config: &PmapConfig) -> Result<(), Error } /// Parse an address for --range: hexadecimal, with or without a 0x prefix, -/// as procps-ng takes it. -fn parse_address(address: &str) -> Result { +/// as procps-ng takes it. `range` is the whole argument, for the error. +fn parse_address(address: &str, range: &str) -> UResult { let digits = address .strip_prefix("0x") .or_else(|| address.strip_prefix("0X")) .unwrap_or(address); u64::from_str_radix(digits, 16) + .map_err(|_| USimpleError::new(1, format!("failed to parse argument: '{range}'"))) } pub fn uu_app() -> Command {