Skip to content

truncate: reject a size above i64::MAX instead of creating the file - #13902

Open
AlejandroCoronadoN wants to merge 1 commit into
uutils:mainfrom
AlejandroCoronadoN:fix-truncate-oob-size
Open

truncate: reject a size above i64::MAX instead of creating the file#13902
AlejandroCoronadoN wants to merge 1 commit into
uutils:mainfrom
AlejandroCoronadoN:fix-truncate-oob-size

Conversation

@AlejandroCoronadoN

Copy link
Copy Markdown
Contributor

Problem

An absolute size in the range (i64::MAX, u64::MAX] was accepted by the size
calculation and only failed later when opening the file, with a misleading
message, after the file had already been created:

$ truncate -s 8E newfile
truncate: cannot open 'newfile' for writing: out of range integral type conversion attempted
$ ls newfile      # created anyway
newfile

GNU truncate rejects it up front and creates nothing:

$ truncate -s 8E newfile
truncate: Invalid number: '8E': Value too large to be stored in data type

Fix

A file size must fit the signed file offset (i64). Check truncate_size > i64::MAX right after the size is computed and return the existing "invalid
number / value too large" error, before the file is opened.

Verification

Compared against GNU truncate over 8E, 9223372036854775808 (i64::MAX + 1),
9223372036854775807 (i64::MAX), 1E, and 100: exit codes and whether the
file is created now match GNU in every case. Added a regression test; the full
test_truncate suite (49 tests) passes and cargo fmt / cargo clippy are
clean.

@codspeed-hq

codspeed-hq Bot commented Aug 13, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 353 untouched benchmarks
⏩ 50 skipped benchmarks1


Comparing AlejandroCoronadoN:fix-truncate-oob-size (908cbf0) with main (dc784af)

Open in CodSpeed

Footnotes

  1. 50 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.

Comment thread src/uu/truncate/src/truncate.rs Outdated
}
})?;

// A size that fits in u64 but exceeds the signed file offset (i64::MAX) is

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make sure you hr comment shorter

An absolute size above i64::MAX passed the size calculation and was only
rejected later when opening the file, with a misleading error, after the file
had been created. Check it against i64::MAX up front and report an invalid
number, like GNU, so nothing is created.
@AlejandroCoronadoN

Copy link
Copy Markdown
Contributor Author

Shortened the comment. Thanks!

@github-actions

Copy link
Copy Markdown

GNU testsuite comparison:

Skip an intermittent issue tests/tail/tail-n0f (fails in this run but passes in the 'main' branch)
Skipping an intermittent issue tests/cut/bounded-memory (passes in this run but fails in the 'main' branch)
Skipping an intermittent issue tests/date/resolution (passes in this run but fails in the 'main' branch)
Skipping an intermittent issue tests/pr/bounded-memory (passes in this run but fails in the 'main' branch)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants