The following reply was made to PR bin/151592; it has been noted by GNATS.

From: =?ISO-8859-1?Q?Jean-S=E9bastien_P=E9dron?=
 <jean-sebastien.ped...@dumbbell.fr>
To: bug-follo...@freebsd.org, mar...@blazingdot.com
Cc:  
Subject: Re: bin/151592: fold(1) segfaults on argument processing
Date: Wed, 03 Nov 2010 23:05:32 +0100

 This is a multi-part message in MIME format.
 --------------060509040604060902020702
 Content-Type: text/plain; charset=ISO-8859-1
 Content-Transfer-Encoding: 8bit
 
 Hello!
 
 Attached is a patch that fixes the segfault for me. Could you please try
 it with your use case?
 
 How to apply the patch:
   # cd /usr/src
   # patch < /path/to/fold-segfault-a.patch
   # cd usr.bin/fold
   # make
 
 You will find a new "fold" binary in this directory or in
 /usr/obj/usr/src/usr.bin/fold if you have a buildworld still present.
 
 Thanks!
 
 -- 
 Jean-Sébastien Pédron
 
 --------------060509040604060902020702
 Content-Type: text/plain;
  name="fold-segfault-a.patch"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
  filename="fold-segfault-a.patch"
 
 Index: usr.bin/fold/fold.c
 ===================================================================
 --- usr.bin/fold/fold.c        (revision 214762)
 +++ usr.bin/fold/fold.c        (working copy)
 @@ -71,14 +71,14 @@
  int
  main(int argc, char **argv)
  {
 -      int ch;
 +      int ch, previous_ch;
        int rval, width;
 -      char *p;
  
        (void) setlocale(LC_CTYPE, "");
  
        width = -1;
 -      while ((ch = getopt(argc, argv, "0123456789bsw:")) != -1)
 +      previous_ch = 0;
 +      while ((ch = getopt(argc, argv, "0123456789bsw:")) != -1) {
                switch (ch) {
                case 'b':
                        bflag = 1;
 @@ -93,17 +93,33 @@
                        break;
                case '0': case '1': case '2': case '3': case '4':
                case '5': case '6': case '7': case '8': case '9':
 -                      if (width == -1) {
 -                              p = argv[optind - 1];
 -                              if (p[0] == '-' && p[1] == ch && !p[2])
 -                                      width = atoi(++p);
 -                              else
 -                                      width = atoi(argv[optind] + 1);
 +                      /* Accept a width as eg. -30. Note that a width
 +                       * specified using the -w option is always used prior
 +                       * to this undocumented option. */
 +                      switch (previous_ch) {
 +                      case '0': case '1': case '2': case '3': case '4':
 +                      case '5': case '6': case '7': case '8': case '9':
 +                              /* The width is a number with multiple digits:
 +                               * add the last one. */
 +                              width = width * 10 + (ch - '0');
 +                              break;
 +                      default:
 +                              /* Set the width, unless it was previously
 +                               * set. For instance, the following options
 +                               * would all give a width of 5 and not 10:
 +                               *   -10 -w5
 +                               *   -5b10
 +                               *   -5 -10b */
 +                              if (width == -1)
 +                                      width = ch - '0';
 +                              break;
                        }
                        break;
                default:
                        usage();
                }
 +              previous_ch = ch;
 +      }
        argv += optind;
        argc -= optind;
  
 
 --------------060509040604060902020702--
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"

Reply via email to