bug-coreutils
[Top][All Lists]
Advanced

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

FYI: don't let pr treat +1:-1 like +1:18446744073709551615


From: Jim Meyering
Subject: FYI: don't let pr treat +1:-1 like +1:18446744073709551615
Date: Fri, 01 Apr 2005 09:44:17 +0200

I was surprised to see that pr didn't reject as invalid a
negative page number.  I've checked this in:

2005-04-01  Jim Meyering  <address@hidden>

        Don't let pr treat +1:-1 like +1:18446744073709551615.
        * src/pr.c (strtoumax): Remove declaration.
        (first_last_page): Use xstrtoumax in place of strtoumax,
        so we don't interpret a negative page number (e.g., in an option
        like --pages=1:-1) as valid.
        * tests/pr/Test.pm (neg-page): Add a test for this.

Index: src/pr.c
===================================================================
RCS file: /fetish/cu/src/pr.c,v
retrieving revision 1.136
diff -u -p -r1.136 pr.c
--- src/pr.c    28 Mar 2005 19:29:54 -0000      1.136
+++ src/pr.c    1 Apr 2005 07:39:07 -0000
@@ -324,10 +324,6 @@
 #include "timespec.h"
 #include "xstrtol.h"
 
-#if ! (HAVE_DECL_STRTOUMAX || defined strtoumax)
-uintmax_t strtoumax ();
-#endif
-
 /* The official name of this program (e.g., no `g' prefix).  */
 #define PROGRAM_NAME "pr"
 
@@ -806,20 +802,19 @@ first_last_page (char const *pages)
   char *p;
   uintmax_t first;
   uintmax_t last = UINTMAX_MAX;
-  int err;
+  strtol_error err = xstrtoumax (pages, &p, 10, &first, "");
+  if (err != LONGINT_OK && err != LONGINT_INVALID_SUFFIX_CHAR)
+    _STRTOL_ERROR (EXIT_FAILURE, pages, _("page range"), err);
 
-  errno = 0;
-  first = strtoumax (pages, &p, 10);
-  err = errno;
   if (p == pages || !first)
     return false;
 
   if (*p == ':')
     {
       char const *p1 = p + 1;
-      errno = 0;
-      last = strtoumax (p1, &p, 10);
-      err |= errno;
+      err = xstrtoumax (p1, &p, 10, &last, "");
+      if (err != LONGINT_OK)
+       _STRTOL_ERROR (EXIT_FAILURE, pages, _("page range"), err);
       if (p1 == p || last < first)
        return false;
     }
@@ -827,9 +822,6 @@ first_last_page (char const *pages)
   if (*p)
     return false;
 
-  if (err)
-    error (EXIT_FAILURE, err, _("Page range `%s'"), pages);
-
   first_page_number = first;
   last_page_number = last;
   return true;

Index: tests/pr/Test.pm
===================================================================
RCS file: /fetish/cu/tests/pr/Test.pm,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -p -u -r1.19 -r1.20
--- tests/pr/Test.pm    15 Mar 2005 18:09:05 -0000      1.19
+++ tests/pr/Test.pm    1 Apr 2005 07:40:33 -0000       1.20
@@ -355,6 +355,10 @@ my @tv = (
 # Make sure these fail.
 ['col-0', '-0', '', '', 1],
 ['col-inval', '-'.'9'x100, '', '', 1],
+
+# Before coreutils-5.3.1, --pages=1:-1 would be treated like
+# --pages=1:18446744073709551615.
+['neg-page', '--pages=1:-1', '', '', 1],
 );
 #']]);
 




reply via email to

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