truncate: reject a size above i64::MAX instead of creating the file - #13902
truncate: reject a size above i64::MAX instead of creating the file#13902AlejandroCoronadoN wants to merge 1 commit into
Conversation
An absolute size that fits in u64 but exceeds i64::MAX (for example `-s 8E`) passed the size calculation and was only rejected later, when opening the file, with a misleading "out of range integral type conversion" error, after the file had already been created. GNU reports an invalid number up front and does not create the file. Check the size against i64::MAX before opening, reusing the existing "value too large" message.
Merging this PR will degrade performance by 3.97%
|
| Mode | Benchmark | BASE |
HEAD |
Efficiency | |
|---|---|---|---|---|---|
| ❌ | Simulation | df_with_path |
573.7 µs | 704.9 µs | -18.62% |
| ⚡ | Simulation | du_max_depth_balanced_tree[(6, 4, 10)] |
65.2 ms | 62.3 ms | +4.54% |
| ⚡ | Simulation | du_summarize_balanced_tree[(5, 4, 10)] |
16.8 ms | 16.1 ms | +4.1% |
Tip
Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.
Comparing AlejandroCoronadoN:fix-truncate-oob-size (90f72f2) with main (822aa83)
Footnotes
-
240 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩
| } | ||
| })?; | ||
|
|
||
| // A size that fits in u64 but exceeds the signed file offset (i64::MAX) is |
There was a problem hiding this comment.
Please make sure you hr comment shorter
Problem
An absolute size in the range
(i64::MAX, u64::MAX]was accepted by the sizecalculation and only failed later when opening the file, with a misleading
message, after the file had already been created:
GNU truncate rejects it up front and creates nothing:
Fix
A file size must fit the signed file offset (
i64). Checktruncate_size > i64::MAXright after the size is computed and return the existing "invalidnumber / value too large" error, before the file is opened.
Verification
Compared against GNU truncate over
8E,9223372036854775808(i64::MAX + 1),9223372036854775807(i64::MAX),1E, and100: exit codes and whether thefile is created now match GNU in every case. Added a regression test; the full
test_truncatesuite (49 tests) passes andcargo fmt/cargo clippyareclean.