bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: update-copyright copyright notice corruption bug


From: Jim Meyering
Subject: Re: update-copyright copyright notice corruption bug
Date: Thu, 03 Jan 2013 16:08:28 +0100

Jim Meyering wrote:
> Joseph S. Myers wrote:
>> On Wed, 2 Jan 2013, Eric Blake wrote:
>>
>>> The original was:
>>>
>>>    Copyright (C) 1995,97,99 Free Software Foundation, Inc.
>>>
>>> and that pattern (4-digits followed by 2-digits, with gaps in the years,
>>> but no spaces in the listing) is not currently tested in the
>>> update-copyright testsuite.
>>
>> I don't believe the "no spaces" is required for this bug to show.  The
>> corruption also appeared for misc/sys/file.h, for example:
>>
>> -/* Copyright (C) 1991, 92, 96, 97, 98, 99 Free Software Foundation, Inc.
>> +/* Copyright (C) 11999, 20131, 1992-1999 Free Software Foundation, Inc.
>
> Here's a minimal test case:
>
>   $ echo '/* Copyright 1991, 99 Free Software Foundation, Inc. */' > k.c
>   $ build-aux/update-copyright k.c && cat k.c
>   /* Copyright 11999, 20131, 1999 Free Software Foundation, Inc. */
>
> It tickles a bug whereby an attempt to replace that "final" year number, 99,
> with 1999 mistakenly matches the "99" in the middle of the *first* date, 1991:
>
> Here's the fix:
>
>>From 25b6e62a48c9991f8166c490463cf73ebc874db4 Mon Sep 17 00:00:00 2001
> From: Jim Meyering <address@hidden>
> Date: Thu, 3 Jan 2013 10:23:30 +0100
> Subject: [PATCH] update-copyright: avoid copyright notice date corruption
>
> Given a sequence of copyright year numbers in which the final
> one was a two-digit number that happened to be a substring of
> a preceding four-digit year number, we would mistakenly update
> the substring (from two- to four-digit) rather than the two-digit
> number at the end, which, combined with the addition of the current
> 4-digit year number would yield two 5-digit year numbers, e.g.,
> here, it would convert the first "99" to "1999, 2013" rather than
> the final one:
>   1991, 99
>   11999, 20131, 1999
> * build-aux/update-copyright: Tighten a regexp.
> * tests/test-update-copyright.sh: Add a test case to trigger the bug.
> Reported by Joseph Myers in
> http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/32281
> ---
>  ChangeLog                      | 18 ++++++++++++++++++
>  build-aux/update-copyright     |  2 +-
>  tests/test-update-copyright.sh |  6 ++++++
>  3 files changed, 25 insertions(+), 1 deletion(-)
>
> diff --git a/ChangeLog b/ChangeLog
> index db79efc..73c186d 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,21 @@
> +2013-01-03  Jim Meyering  <address@hidden>
> +
> +     update-copyright: avoid copyright notice date corruption
> +     Given a sequence of copyright year numbers in which the final
> +     one was a two-digit number that happened to be a substring of
> +     a preceding four-digit year number, we would mistakenly update
> +     the substring (from two- to four-digit) rather than the two-digit
> +     number at the end, which, combined with the addition of the current
> +     4-digit year number would yield two 5-digit year numbers, e.g.,
> +     here, it would convert the first "99" to "1999, 2013" rather than
> +     the final one:
> +       1991, 99
> +       11999, 20131, 1999
> +     * build-aux/update-copyright: Tighten a regexp.
> +     * tests/test-update-copyright.sh: Add a test case to trigger the bug.
> +     Reported by Joseph Myers in
> +     http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/32281
...
> diff --git a/build-aux/update-copyright b/build-aux/update-copyright
> index c51ac64..da84c66 100755
> --- a/build-aux/update-copyright
> +++ b/build-aux/update-copyright
> @@ -3,7 +3,7 @@ eval '(exit $?0)' && eval 'exec perl -wS -0777 -pi "$0" 
> ${1+"$@"}'
>      if 0;
>  # Update an FSF copyright year list to include the current year.
>
> -my $VERSION = '2012-02-05.21:39'; # UTC
> +my $VERSION = '2013-01-03.08:43'; # UTC
>
>  # Copyright (C) 2009-2013 Free Software Foundation, Inc.
>  #

For the record, that lacked the actual fix.
Here's what I posted when Andreas Jaeger mentioned it on the libc-alpha list.
[But note, this isn't perfect, since it would still misbehave for a line
 like this, with two identical two-digit year numbers:

 /* Copyright 1983, 99, 99 Free Software Foundation, Inc. */

 but I think malformed lines like that will be rare,
 and would prefer to avoid the complexity of the more general fix. ]

>From 4f439be5eb433f530123e45c5d87d5af91f952ac Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Thu, 3 Jan 2013 10:23:30 +0100
Subject: [PATCH] update-copyright: avoid copyright notice date corruption

Given a sequence of copyright year numbers in which the final
one was a two-digit number that happened to be a substring of
a preceding four-digit year number, we would mistakenly update
the substring (from two- to four-digit) rather than the two-digit
number at the end, which, combined with the addition of the current
4-digit year number would yield two 5-digit year numbers, e.g.,
here, it would convert the first "99" to "1999, 2013" rather than
the final one:
  1991, 99
  11999, 20131, 1999
* build-aux/update-copyright: Tighten a regexp.
* tests/test-update-copyright.sh: Add a test case to trigger the bug.
Reported by Joseph Myers in
http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/32281
---
 ChangeLog                      | 18 ++++++++++++++++++
 build-aux/update-copyright     |  4 ++--
 tests/test-update-copyright.sh |  6 ++++++
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index db79efc..73c186d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2013-01-03  Jim Meyering  <address@hidden>
+
+       update-copyright: avoid copyright notice date corruption
+       Given a sequence of copyright year numbers in which the final
+       one was a two-digit number that happened to be a substring of
+       a preceding four-digit year number, we would mistakenly update
+       the substring (from two- to four-digit) rather than the two-digit
+       number at the end, which, combined with the addition of the current
+       4-digit year number would yield two 5-digit year numbers, e.g.,
+       here, it would convert the first "99" to "1999, 2013" rather than
+       the final one:
+         1991, 99
+         11999, 20131, 1999
+       * build-aux/update-copyright: Tighten a regexp.
+       * tests/test-update-copyright.sh: Add a test case to trigger the bug.
+       Reported by Joseph Myers in
+       http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/32281
+
 2013-01-01  Paul Eggert  <address@hidden>

        regex: omit needless signed-pointer casts
diff --git a/build-aux/update-copyright b/build-aux/update-copyright
index c51ac64..c72d0e6 100755
--- a/build-aux/update-copyright
+++ b/build-aux/update-copyright
@@ -3,7 +3,7 @@ eval '(exit $?0)' && eval 'exec perl -wS -0777 -pi "$0" 
${1+"$@"}'
     if 0;
 # Update an FSF copyright year list to include the current year.

-my $VERSION = '2012-02-05.21:39'; # UTC
+my $VERSION = '2013-01-03.09:41'; # UTC

 # Copyright (C) 2009-2013 Free Software Foundation, Inc.
 #
@@ -192,7 +192,7 @@ if (defined $stmt_re)
     if ($final_year != $this_year)
       {
         # Update the year.
-        $stmt =~ s/$final_year_orig/$final_year, $this_year/;
+        $stmt =~ s/\b$final_year_orig\b/$final_year, $this_year/;
       }
     if ($final_year != $this_year || $ENV{'UPDATE_COPYRIGHT_FORCE'})
       {
diff --git a/tests/test-update-copyright.sh b/tests/test-update-copyright.sh
index efecebe..60cb372 100755
--- a/tests/test-update-copyright.sh
+++ b/tests/test-update-copyright.sh
@@ -505,6 +505,9 @@ cat > $TMP.extra-text-space <<EOF
  /* Copyright 1987, 1988, 1991, 1992 Free Software Foundation, Inc. ***
     * End of comments. */
 EOF
+cat > $TMP.two-digit-final-is-substr-of-first <<EOF
+ /* Copyright 1991, 99 Free Software Foundation, Inc. */
+EOF
 UPDATE_COPYRIGHT_YEAR=2010 \
   update-copyright $TMP.* 1> $TMP-stdout 2> $TMP-stderr
 compare /dev/null $TMP-stdout || exit 1
@@ -536,6 +539,9 @@ compare - $TMP.extra-text-space <<EOF || exit 1
     Inc. ***
     * End of comments. */
 EOF
+compare - $TMP.two-digit-final-is-substr-of-first <<EOF || exit 1
+ /* Copyright 1991, 1999, 2010 Free Software Foundation, Inc. */
+EOF
 rm $TMP*

 exit 0
--
1.8.1



reply via email to

[Prev in Thread] Current Thread [Next in Thread]