ITADN

pr panics ("Formatting argument out of range") on a large `-n` width or `-W`/`-w` page width

#13735Closedleeewee 创建于 26 天前
U - pr
L
leeeweecommented
`pr` builds its line-number column and its page header with `format!` width arguments taken directly from the `-n` (number-line width) and `-W`/`--page-width` (line width) options, which panics when the resulting width exceeds `u16::MAX` (65535). ```console $ printf 'x\n' | pr -n 70000 - thread 'main' panicked at src/uu/pr/src/pr.rs:1497:13: Formatting argument out of range $ echo $? 134 $ printf 'l1\nl2\n' > /tmp/pr_in $ pr -W 200000 /tmp/pr_in thread 'main' panicked at src/uu/pr/src/pr.rs:1532:9: Formatting argument out of range $ echo $? 134 ``` ## Root cause **`-n` line-number width (latest `pr.rs:1497`, d928f05 `:1336`):** the width comes straight from the parsed `-n` option and feeds a right-justify format: ```rust // src/uu/pr/src/pr.rs:1491-1497 (get_formatted_line_number) let num_opt = opts.number.as_ref().unwrap(); let width = num_opt.width; // <- from -n DIGITS, unbounded ... format!("{line_str:>width$}{separator}") // :1497 — panics when width > u16::MAX ``` **`-W`/page width (latest `pr.rs:1532`, d928f05 `:1371`):** the page width flows into the centered-header padding widths: ```rust // src/uu/pr/src/pr.rs:1528-1534 (header layout) let space_for_filename = total_width - date_len - page_len; // total_width from -W let padding_before_filename = (space_for_filename - filename_len) / 2; let padding_after_filename = space_for_filename - filename_len - padding_before_filename; format!( // :1532 — panics when a padding > u16::MAX "{date_part}{:padding_before_filename$}{filename}{:padding_after_filename$}{page_part}", "", "" ) ``` In both cases a width/padding above 65535 reaches a `format!` count and aborts.
关闭于 22 天前 0 条评论