mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-08-05 08:10:15 +02:00
cut: fix handling of overlapping ranges
This issue was introduced in commit v8.21-43-g3e466ad * src/cut.c (set_fields): Process all range pairs when merging. * tests/misc/cut-huge-range.sh: Add a test for this edge case. Also fix an issue where we could miss reported errors due to truncation of the 'err' file.
This commit is contained in:
committed by
Pádraig Brady
parent
7fbe8f4686
commit
b54b47f954
@@ -496,9 +496,9 @@ set_fields (const char *fieldstr)
|
||||
if (rp[j].lo <= rp[i].hi)
|
||||
{
|
||||
rp[i].hi = MAX (rp[j].hi, rp[i].hi);
|
||||
memmove (rp + j, rp + j + 1,
|
||||
(n_rp - j - 1) * sizeof (struct range_pair));
|
||||
--n_rp;
|
||||
memmove (rp + j, rp + j + 1, (n_rp - j - 1) * sizeof *rp);
|
||||
n_rp--;
|
||||
j--;
|
||||
}
|
||||
else
|
||||
break;
|
||||
|
||||
@@ -27,7 +27,13 @@ getlimits_
|
||||
|
||||
# Up to and including coreutils-8.21, cut would allocate possibly needed
|
||||
# memory upfront. Subsequently memory is allocated as required.
|
||||
(ulimit -v 20000; : | cut -b1-$INT_MAX > err 2>&1) || fail=1
|
||||
(ulimit -v 20000; : | cut -b1-$INT_MAX >> err 2>&1) || fail=1
|
||||
|
||||
# Ensure ranges are merged correctly when large range logic is in effect
|
||||
echo 1 > exp
|
||||
(dd bs=1MB if=/dev/zero count=1; echo '1') |
|
||||
cut -b1-1000000,2-3,4-5,1000001 2>>err | tail -c2 > out || fail=1
|
||||
compare exp out || fail=1
|
||||
|
||||
compare /dev/null err || fail=1
|
||||
|
||||
|
||||
Reference in New Issue
Block a user