strlim: avoid one-byte stack overflow#7408
Merged
Merged
Conversation
Since the limit is up to 500 characters, make sure to allocate 501
bytes, including the terminator at the end, avoiding the stack overflow:
data.table::fread(text = paste0(
strrep("mary had a little lamb\n", 100),
strrep("a", 500), "\n", "a")
)
==5358==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffd0f20c7e4 at pc 0x7f06826bb311 bp 0x7ffd0f20ad90 sp 0x7ffd0f20ad88
WRITE of size 1 at 0x7ffd0f20c7e4 thread T0
#0 0x7f06826bb310 in strlim /tmp/RtmpvbbbcM/R.INSTALLd607e4c6707/data.table/src/fread.c:235
#1 0x7f06826bb310 in freadMain /tmp/RtmpvbbbcM/R.INSTALLd607e4c6707/data.table/src/fread.c:2947
#2 0x7f06826c2d62 in freadR /tmp/RtmpvbbbcM/R.INSTALLd607e4c6707/data.table/src/freadR.c:229
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #7408 +/- ##
=======================================
Coverage 99.13% 99.13%
=======================================
Files 85 85
Lines 16621 16621
=======================================
Hits 16477 16477
Misses 144 144 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Generated via commit 86dbab2 Download link for the artifact containing the test results: ↓ atime-results.zip
|
Member
|
Would the simple example you shared be useful in the test suite? data.table::fread(text = paste0(
strrep("mary had a little lamb\n", 100),
strrep("a", 500), "\n", "a")
) |
MichaelChirico
approved these changes
Nov 3, 2025
Member
I guess not since the error only surfaces with ASAN IINM |
Member
Author
|
We have AddressSanitizer in GitLab CI. I don't mind adding a test if it is warranted. |
Truncate the messages silently in case of overflow.
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.

Since the limit is up to 500 characters, make sure to allocate 501 bytes, including the terminator at the end, avoiding the stack overflow introduced in #7005:
Will this need a test? By itself the overflow is probably harmless, as it only writes a single zero into a place on the stack that doesn't seem to be used by anything, but it trips up sanitizers before other crashes can be reproduced, for example:
Details
...eventually: