Rob Landley writes:
authorEric Andersen <andersen@codepoet.org>
Wed, 4 Feb 2004 10:57:46 +0000 (10:57 -0000)
committerEric Andersen <andersen@codepoet.org>
Wed, 4 Feb 2004 10:57:46 +0000 (10:57 -0000)
While building glibc with busybox as part of the development environment, I
found a bug in glibc's regexec can throw sed into an endless loop.  This
fixes it.  Should I put an #ifdef around it or something?  (Note, this patch
also contains the "this is not gnu sed 4.0" hack I posted earlier, which is
also needed to build glibc...)

editors/sed.c

index a0d0cf74b7eb696f8448845406565c8bf199e256..5832e99a926e0b1e2a894e24d8f0a40acb861b0a 100644 (file)
@@ -618,6 +618,15 @@ static int do_subst_command(sed_cmd_t * sed_cmd, char **line)
        do {
                int i;
 
+               /* Work around bug in glibc regexec, demonstrated by:
+                  echo " a.b" | busybox sed 's [^ .]* x g'
+                  The match_count check is so not to break
+                  echo "hi" | busybox sed 's/^/!/g' */
+               if(!regmatch[0].rm_so && !regmatch[0].rm_eo && match_count) {
+                       pipe_putc(*(oldline++));
+                       continue;
+               }
+
                match_count++;
 
                /* If we aren't interested in this match, output old line to
@@ -1073,6 +1082,14 @@ extern int sed_main(int argc, char **argv)
                bb_perror_msg_and_die("atexit");
 #endif
 
+#define LIE_TO_AUTOCONF
+#ifdef LIE_TO_AUTOCONF
+       if(argc==2 && !strcmp(argv[1],"--version")) {
+               printf("This is not GNU sed version 4.0\n");
+               exit(0);
+       }
+#endif
+
        /* do normal option parsing */
        while ((opt = getopt(argc, argv, "ne:f:")) > 0) {
                switch (opt) {