tac: use temp file for stdin to respect TMPDIR and handle disk-full errors#10094
Merged
Conversation
|
GNU testsuite comparison: |
|
GNU testsuite comparison: |
ChrisDryden
marked this pull request as ready for review
January 7, 2026 01:09
sylvestre
reviewed
Jan 7, 2026
CodSpeed Performance ReportMerging this PR will not alter performanceComparing Summary
Footnotes
|
|
GNU testsuite comparison: |
Collaborator
Author
|
Promise I'm not just rebasing for the sake of rebasing, all of the ones I've rebased right now all have merge conflicts that I'm sorting out |
ChrisDryden
force-pushed
the
tac-stdin-tempfile
branch
from
January 9, 2026 17:33
61788e3 to
fbec632
Compare
|
GNU testsuite comparison: |
oech3
reviewed
Jan 15, 2026
| curl -L ${repo}/raw/refs/heads/master/tests/runcon/runcon-compute.sh > tests/runcon/runcon-compute.sh | ||
| curl -L ${repo}/raw/refs/heads/master/tests/tac/tac-continue.sh > tests/tac/tac-continue.sh | ||
| # Add tac-continue.sh to root tests (it requires root to mount tmpfs) | ||
| sed -i 's|tests/split/l-chunk-root.sh.*|tests/split/l-chunk-root.sh\t\t\t\\\n tests/tac/tac-continue.sh\t\t\t\\|' tests/local.mk |
Contributor
There was a problem hiding this comment.
sed -i does not work on macOS. So I changed it to -i.bak at #10201
DarthStrom
added a commit
to DarthStrom/coreutils
that referenced
this pull request
Jun 20, 2026
tac memory-mapped regular files. If another process truncated such a file while it was mapped (e.g. during log rotation), accessing the now-invalid pages raised SIGBUS and killed the process. Read regular files into memory up front instead, so a concurrent truncation can no longer crash tac. The stdin path had the same hole by a different route: `tac < file` mapped the raw stdin fd -- the caller's regular file -- directly. Remove that direct-stdin mmap and always route stdin through a process-owned temp file (already used to bound memory on large stdin, see uutils#10094). The temp file is created unlinked, so no other process can truncate it and mapping it stays sound. Adds regression tests that truncate a file mid-read, via both an argument and stdin redirection, and assert tac is not killed by a signal. Fixes uutils#9748 Co-authored-by: easonysliu <easonysliu@tencent.com> Co-authored-by: Charlie Tonneslan <cst0520@gmail.com>
3 tasks
DarthStrom
added a commit
to DarthStrom/coreutils
that referenced
this pull request
Jun 21, 2026
tac memory-mapped regular files. If another process truncated such a file while it was mapped (e.g. during log rotation), accessing the now-invalid pages raised SIGBUS and killed the process. Read regular files into memory up front instead, so a concurrent truncation can no longer crash tac. The stdin path had the same hole by a different route: `tac < file` mapped the raw stdin fd -- the caller's regular file -- directly. Remove that direct-stdin mmap and always route stdin through a process-owned temp file (already used to bound memory on large stdin, see uutils#10094). The temp file is created unlinked, so no other process can truncate it and mapping it stays sound. Adds regression tests that truncate a file mid-read, via both an argument and stdin redirection, and assert tac is not killed by a signal. Fixes uutils#9748 Co-authored-by: easonysliu <easonysliu@tencent.com> Co-authored-by: Charlie Tonneslan <cst0520@gmail.com>
DarthStrom
added a commit
to DarthStrom/coreutils
that referenced
this pull request
Jul 3, 2026
tac memory-mapped regular files. If another process truncated such a file while it was mapped (e.g. during log rotation), accessing the now-invalid pages raised SIGBUS and killed the process. Read regular files into memory up front instead, so a concurrent truncation can no longer crash tac. The stdin path had the same hole by a different route: `tac < file` mapped the raw stdin fd -- the caller's regular file -- directly. Remove that direct-stdin mmap and always route stdin through a process-owned temp file (already used to bound memory on large stdin, see uutils#10094). The temp file is created unlinked, so no other process can truncate it and mapping it stays sound. Adds regression tests that truncate a file mid-read, via both an argument and stdin redirection, and assert tac is not killed by a signal. Fixes uutils#9748 Co-authored-by: easonysliu <easonysliu@tencent.com> Co-authored-by: Charlie Tonneslan <cst0520@gmail.com>
DarthStrom
added a commit
to DarthStrom/coreutils
that referenced
this pull request
Jul 3, 2026
tac memory-mapped regular files. If another process truncated such a file while it was mapped (e.g. during log rotation), accessing the now-invalid pages raised SIGBUS and killed the process. Read regular files into memory up front instead, so a concurrent truncation can no longer crash tac. The stdin path had the same hole by a different route: `tac < file` mapped the raw stdin fd -- the caller's regular file -- directly. Remove that direct-stdin mmap and always route stdin through a process-owned temp file (already used to bound memory on large stdin, see uutils#10094). The temp file is created unlinked, so no other process can truncate it and mapping it stays sound. Adds regression tests that truncate a file mid-read, via both an argument and stdin redirection, and assert tac is not killed by a signal. Fixes uutils#9748 Co-authored-by: easonysliu <easonysliu@tencent.com> Co-authored-by: Charlie Tonneslan <cst0520@gmail.com>
DarthStrom
added a commit
to DarthStrom/coreutils
that referenced
this pull request
Jul 3, 2026
tac memory-mapped regular files. If another process truncated such a file while it was mapped (e.g. during log rotation), accessing the now-invalid pages raised SIGBUS and killed the process. Read regular files into memory up front instead, so a concurrent truncation can no longer crash tac. The stdin path had the same hole by a different route: `tac < file` mapped the raw stdin fd -- the caller's regular file -- directly. Remove that direct-stdin mmap and always route stdin through a process-owned temp file (already used to bound memory on large stdin, see uutils#10094). The temp file is created unlinked, so no other process can truncate it and mapping it stays sound. Adds regression tests that truncate a file mid-read, via both an argument and stdin redirection, and assert tac is not killed by a signal. Fixes uutils#9748 Co-authored-by: easonysliu <easonysliu@tencent.com> Co-authored-by: Charlie Tonneslan <cst0520@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The tac-continue test used to rely on having an accessible TMP_DIR, the test was changed and now it was updated to be more flexible. Ultimately the functionality of tac in our implementation compared to the GNU implementation was just different from the context that the stdin is buffered to a TMP_DIR in the GNU implementation and not in the uutils implementation. This can cause issues with large STDIN because it will always max out the memory and timeout instead of erroring and it takes up significantly more memory.