Subject: Re: bug#12966: cut: Problems with overlapping, open-ended ranges

From: Marcel Boehme <[email-masked]>
Date: Sat, 24 Nov 2012 16:45:39 +0800

Dear Mr. Meyering,

If adding me to THANKS, could you kindly point to: http://www.comp.nus.edu.sg/~mboehme instead of my (spam) email address?

Thank you very much indeed! Great work!

Best regards,
Marcel

On 24 Nov, 2012, at 3:11 PM, Jim Meyering <[email-masked]> wrote:

> Marcel Böhme wrote:
>>   I found two (semantically related) bugs. One seems to originate in the
>>   first version. For research purposes, I would appreciate if you could
>>   confirm that the second was introduced with Coreutils 5.3.0.
>>   1) The following bug seems to exists "since the beginning".
>>   $echo 1234567890 | ./cut -b 2-,3,4-4,5,9-
>>   3590
>>   $echo 1234567890 | ./cut -b 2-,3,4-4,5,9-10
>>   234567890
>>   $echo 1234567890 | ./cut -b 2-10,3,4-4,5,9-
>>   234567890
> 
> Thank you for the reports!  That is definitely a bug.
> Here's a proposed fix:
> [I'll look at the other one tomorrow if no one
> gets to it first. ]
> 
> From 99084373fb7a12888234958ff0961643cf029dae Mon Sep 17 00:00:00 2001
> From: Jim Meyering <[email-masked]>
> Date: Fri, 23 Nov 2012 23:09:10 -0800
> Subject: [PATCH] cut: interpret "-b3-,2-" like "-b2-", not like "-b3-"
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
> 
> * src/cut.c (set_fields): When two right-open-ended ranges are
> specified, don't blindly let the latter one take precedence over
> the former.  Instead, use the union of the ranges.
> * tests/misc/cut.pl: Add test to exercise this.
> * THANKS.in: Attribute.
> * NEWS (Bug fixes): Mention it.
> Reported by Marcel Böhme in http://bugs.gnu.org/12966
> ---
> NEWS              | 4 ++++
> THANKS.in         | 1 +
> src/cut.c         | 6 ++++--
> tests/misc/cut.pl | 3 +++
> 4 files changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/NEWS b/NEWS
> index 15fddd4..284525e 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -14,6 +14,10 @@ GNU coreutils NEWS                                    -*- outline -*-
>   Instead, cut now fails and emits an appropriate diagnostic.
>   [This bug was present in "the beginning".]
> 
> +  cut now handles overlapping right-open-ended ranges properly.  Before,
> +  it would interpret "-b3-,2-" like "-b3-".  Now it's treated like "-b2-".
> +  [This bug was present in "the beginning".]
> +
>   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/THANKS.in b/THANKS.in
> index 016a41e..3080cd3 100644
> --- a/THANKS.in
> +++ b/THANKS.in
> @@ -367,6 +367,7 @@ Marc Haber                          [email-masked]
> Marc Mengel                         [email-masked]
> Marc Lehman                         [email-masked]
> Marc Olzheim                        [email-masked]
> +Marcel Böhme                        [email-masked]
> Marco Franzen                       [email-masked]
> Marcus Brinkmann                    http://www.marcus-brinkmann.de
> Marcus Daniels                      [email-masked]
> diff --git a/src/cut.c b/src/cut.c
> index 2a57148..b464840 100644
> --- a/src/cut.c
> +++ b/src/cut.c
> @@ -391,8 +391,10 @@ set_fields (const char *fieldstr)
>                  In any case, 'initial' contains the start of the range. */
>               if (!rhs_specified)
>                 {
> -                  /* 'n-'.  From 'initial' to end of line. */
> -                  eol_range_start = initial;
> +                  /* 'n-'.  From 'initial' to end of line.  If we've already
> +                     seen an M- range, ignore subsequent N- unless N < M.  */
> +                  if (eol_range_start == 0 || initial < eol_range_start)
> +                    eol_range_start = initial;
>                   field_found = true;
>                 }
>               else
> diff --git a/tests/misc/cut.pl b/tests/misc/cut.pl
> index cd56555..cb4781a 100755
> --- a/tests/misc/cut.pl
> +++ b/tests/misc/cut.pl
> @@ -163,6 +163,9 @@ my @Tests =
>   ['big-unbounded-b', '--output-d=:', '-b1234567890-', {IN=>''}, {OUT=>''}],
>   ['big-unbounded-c', '--output-d=:', '-c1234567890-', {IN=>''}, {OUT=>''}],
>   ['big-unbounded-f', '--output-d=:', '-f1234567890-', {IN=>''}, {OUT=>''}],
> +
> +  ['overlapping-unbounded-1', '-b3-,2-', {IN=>"1234\n"}, {OUT=>"234\n"}],
> +  ['overlapping-unbounded-2', '-b2-,3-', {IN=>"1234\n"}, {OUT=>"234\n"}],
>  );
> 
> if ($mb_locale ne 'C')
> --
> 1.8.0.251.g3a189da