summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--src/cut.c9
-rwxr-xr-xtests/misc/cut.pl9
3 files changed, 18 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index 63583c1a7..d4aebeb21 100644
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,10 @@ GNU coreutils NEWS -*- outline -*-
interpret "-b2-,3-" like "-b3-". Now it's treated like "-b2-".
[This bug was present in "the beginning".]
+ cut no longer prints extraneous delimiters when a to-EOL range subsumes
+ another range. Before, "echo 123|cut --output-delim=: -b2-,3" would print
+ "2:3". Now it prints "23". [bug introduced in 5.3.0]
+
install -m M SOURCE DEST no longer has a race condition where DEST's
permissions are temporarily derived from SOURCE instead of from M.
diff --git a/src/cut.c b/src/cut.c
index b464840d7..4219d24e9 100644
--- a/src/cut.c
+++ b/src/cut.c
@@ -514,17 +514,18 @@ set_fields (const char *fieldstr)
/* Set the array entries corresponding to integers in the ranges of RP. */
for (i = 0; i < n_rp; i++)
{
- size_t j;
- size_t rsi_candidate;
+ /* Ignore any range that is subsumed by the to-EOL range. */
+ if (eol_range_start && eol_range_start <= rp[i].lo)
+ continue;
/* Record the range-start indices, i.e., record each start
index that is not part of any other (lo..hi] range. */
- rsi_candidate = complement ? rp[i].hi + 1 : rp[i].lo;
+ size_t rsi_candidate = complement ? rp[i].hi + 1 : rp[i].lo;
if (output_delimiter_specified
&& !is_printable_field (rsi_candidate))
mark_range_start (rsi_candidate);
- for (j = rp[i].lo; j <= rp[i].hi; j++)
+ for (size_t j = rp[i].lo; j <= rp[i].hi; j++)
mark_printable_field (j);
}
diff --git a/tests/misc/cut.pl b/tests/misc/cut.pl
index cb4781a7d..27768ff29 100755
--- a/tests/misc/cut.pl
+++ b/tests/misc/cut.pl
@@ -166,6 +166,15 @@ my @Tests =
['overlapping-unbounded-1', '-b3-,2-', {IN=>"1234\n"}, {OUT=>"234\n"}],
['overlapping-unbounded-2', '-b2-,3-', {IN=>"1234\n"}, {OUT=>"234\n"}],
+
+ # When printing output delimiters, and with one or more ranges subsumed
+ # by a to-EOL range, cut 8.20 and earlier would print extraneous delimiters.
+ ['EOL-subsumed-1', '--output-d=: -b2-,3,4-4,5',
+ {IN=>"123456\n"}, {OUT=>"23456\n"}],
+ ['EOL-subsumed-2', '--output-d=: -b3,4-4,5,2-',
+ {IN=>"123456\n"}, {OUT=>"23456\n"}],
+ ['EOL-subsumed-3', '--complement -b3,4-4,5,2-',
+ {IN=>"123456\n"}, {OUT=>"1\n"}],
);
if ($mb_locale ne 'C')