Busybox 1.1.0 tr problem

m.pommerenke at avm.de m.pommerenke at avm.de
Wed Jan 18 11:21:32 UTC 2006


Hi Henry,

> # echo abc123 | busybox tr -d "[0-9]"
> Segmentation fault (core dumped)

we have fixed this already.

1) tr "[0-9]"   Segmentation fault (core dumped)
2) tr "\[0"     did not work

I know it's a hack but it should work.

The bb_process_escape_sequence function returns '\' if you use is on an
expression like "\[".
It behaves like this on every escape sequence not known.

Martin Pommerenke
AVM Berlin



static unsigned int expand(const char *arg, register unsigned char *buffer)
{
      unsigned char *buffer_start = buffer;
      int i, ac;

      while (*arg) {
            if (*arg == '\\') {
            char save = *(++arg);
            /*--- pp_process_escape_sequence verhaelt sich fehlerhaft, wenn
es nichst zu excapen gibt ---*/
            *buffer = bb_process_escape_sequence(&arg);
            if((*buffer == '\\') && (save != '\\')) { /* HACK */
                *buffer = save;
            }
            buffer++;
            } else if (*(arg+1) == '-') {
                  ac = *(arg+2);
                  if(ac == 0) {
                        *buffer++ = *arg++;
                        continue;
                  }
                  i = *arg;
                  while (i <= ac)
                        *buffer++ = i++;
                  arg += 3; /* Skip the assumed a-z */
            } else if (*arg == '[') {
                  arg++;
                  if (ENABLE_FEATURE_TR_CLASSES && *arg++ == ':') {
                        if (strncmp(arg, "alpha", 5) == 0) {
                              for (i = 'A'; i <= 'Z'; i++)
                                    *buffer++ = i;
                              for (i = 'a'; i <= 'z'; i++)
                                    *buffer++ = i;
                        }
                        else if (strncmp(arg, "alnum", 5) == 0) {
                              for (i = 'A'; i <= 'Z'; i++)
                                    *buffer++ = i;
                              for (i = 'a'; i <= 'z'; i++)
                                    *buffer++ = i;
                              for (i = '0'; i <= '9'; i++)
                                    *buffer++ = i;
                        }
                        else if (strncmp(arg, "digit", 5) == 0)
                              for (i = '0'; i <= '9'; i++)
                                    *buffer++ = i;
                        else if (strncmp(arg, "lower", 5) == 0)
                              for (i = 'a'; i <= 'z'; i++)
                                    *buffer++ = i;
                        else if (strncmp(arg, "upper", 5) == 0)
                              for (i = 'A'; i <= 'Z'; i++)
                                    *buffer++ = i;
                        else if (strncmp(arg, "space", 5) == 0)
                              strcat(buffer, " \f\n\r\t\v");
                        else if (strncmp(arg, "blank", 5) == 0)
                              strcat(buffer, " \t");
                        /* gcc gives a warning if braces aren't used here
*/
                        else if (strncmp(arg, "punct", 5) == 0) {
                              for (i = 0; i <= ASCII; i++)
                                    if (isprint(i) && (!isalnum(i)) &&
(!isspace(i)))
                                          *buffer++ = i;
                        }
                        else if (strncmp(arg, "cntrl", 5) == 0) {
                              for (i = 0; i <= ASCII; i++)
                                    if (iscntrl(i))
                                          *buffer++ = i;
                        }
                        else {
                              /*--- strcat(buffer, "[:"); ---*/
                              strcat(buffer, ":");
                              arg++;
                              continue;
                        }
                        break;
                  }
                  if (ENABLE_FEATURE_TR_EQUIV && *arg++ == '=') {
                        *buffer++ = *arg;
                        /* skip the closing =] */
                        arg += 3;
                        continue;
                  }
                  if (*arg++ != '-') {
                        /*--- *buffer++ = '['; ---*//* m.pommerenke at avm.de:
war immer in der auswahl vorhanden */
                        arg -= 1; /* m.pommerenke at avm.de: org 2 ==> dann
aber endlosschleife */
                        continue;
                  }
                  i = *arg++;
                  ac = *arg++;
                  while (i <= ac)
                        *buffer++ = i++;
                  arg++;                        /* Skip the assumed ']' */
            } else if (*arg == ']') {  /* m.pommerenke at avm.de: war immer in
der auswahl vorhanden */
            *arg++;
            } else
                  *buffer++ = *arg++;
      }

      return (buffer - buffer_start);
}





                                                                           
             Henry Pan                                                     
             <pank at pank.org>                                               
             Gesendet von:                                              An 
             busybox-bounces at b          busybox at busybox.net                
             usybox.net                                              Kopie 
                                                                           
                                                                     Thema 
             18.01.2006 10:33           Busybox 1.1.0 tr problem           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           
                                                                           




# echo abc123 | busybox tr -d "[0-9]"
Segmentation fault (core dumped)

1.01 tr does not have the problem.
_______________________________________________
busybox mailing list
busybox at busybox.net
http://busybox.net/cgi-bin/mailman/listinfo/busybox





More information about the busybox mailing list