OSDN Git Service

The glibc bug at https://sourceware.org/bugzilla/show_bug.cgi?id=17829
authorRob Landley <rob@landley.net>
Wed, 15 Jun 2016 16:43:48 +0000 (11:43 -0500)
committerRob Landley <rob@landley.net>
Wed, 15 Jun 2016 16:43:48 +0000 (11:43 -0500)
continues to get worse, and now can't handle INT_MAX/2 either. So our
first workaround _also_ broke.

But posix says "A negative precision is taken as if the precision were
omitted." and that _doesn't_ trigger the glibc bug, so use that instead.

toys/posix/grep.c

index 2ca02d2..9e50a7c 100644 (file)
@@ -74,7 +74,7 @@ static void outline(char *line, char dash, char *name, long lcount, long bcount,
   if (!line || (lcount && (toys.optflags&FLAG_n)))
     printf("%ld%c", lcount, line ? dash : TT.outdelim);
   if (bcount && (toys.optflags&FLAG_b)) printf("%ld%c", bcount-1, dash);
-  if (line) xprintf("%.*s%c", trim ? trim : INT_MAX/2, line, TT.outdelim);
+  if (line) xprintf("%.*s%c", trim, line, TT.outdelim);
 }
 
 // Show matches in one file
@@ -201,13 +201,13 @@ static void do_grep(int fd, char *name)
           while (dlb) {
             struct double_list *dl = dlist_pop(&dlb);
 
-            outline(dl->data, '-', name, lcount-before, 0, 0);
+            outline(dl->data, '-', name, lcount-before, 0, -1);
             free(dl->data);
             free(dl);
             before--;
           }
 
-          outline(line, ':', name, lcount, bcount, 0);
+          outline(line, ':', name, lcount, bcount, -1);
           if (TT.a) after = TT.a+1;
         } else outline(start+matches.rm_so, ':', name, lcount, bcount,
                        matches.rm_eo-matches.rm_so);
@@ -223,7 +223,7 @@ static void do_grep(int fd, char *name)
       int discard = (after || TT.b);
 
       if (after && --after) {
-        outline(line, '-', name, lcount, 0, 0);
+        outline(line, '-', name, lcount, 0, -1);
         discard = 0;
       }
       if (discard && TT.b) {
@@ -247,7 +247,7 @@ static void do_grep(int fd, char *name)
     if ((toys.optflags & FLAG_m) && mcount >= TT.m) break;
   }
 
-  if (toys.optflags & FLAG_c) outline(0, ':', name, mcount, 0, 0);
+  if (toys.optflags & FLAG_c) outline(0, ':', name, mcount, 0, -1);
 
   // loopfiles will also close the fd, but this frees an (opaque) struct.
   fclose(file);