getopt32: do not return pointer to alloca() areas
authorDenis Vlasenko <vda.linux@googlemail.com>
Wed, 20 Aug 2008 23:03:38 +0000 (23:03 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Wed, 20 Aug 2008 23:03:38 +0000 (23:03 -0000)
libbb/getopt32.c

index 54dc7857d40ef7fe2622f7c2221384a92cfafbe7..8fb99b6cca116fe70decac3c5ec86b4122c10c1c 100644 (file)
@@ -155,12 +155,20 @@ Special characters:
         Allows any arguments to be given without a dash (./program w x)
         as well as with a dash (./program -x).
 
+       NB: getopt32() will leak a small amount of memory if you use
+       this option! Do not use it if there is a possibility of recursive
+       getopt32() calls.
+
  "--"   A double dash at the beginning of opt_complementary means the
         argv[1] string should always be treated as options, even if it isn't
         prefixed with a "-".  This is useful for special syntax in applets
         such as "ar" and "tar":
         tar xvf foo.tar
 
+       NB: getopt32() will leak a small amount of memory if you use
+       this option! Do not use it if there is a possibility of recursive
+       getopt32() calls.
+
  "-N"   A dash as the first char in a opt_complementary group followed
         by a single digit (0-9) means that at least N non-option
         arguments must be present on the command line
@@ -493,7 +501,10 @@ getopt32(char **argv, const char *applet_opts, ...)
                pargv = argv + 1;
                while (*pargv) {
                        if (pargv[0][0] != '-' && pargv[0][0] != '\0') {
-                               char *pp = alloca(strlen(*pargv) + 2);
+                               /* Can't use alloca: opts with params will
+                                * return pointers to stack!
+                                * NB: we leak these allocations... */
+                               char *pp = xmalloc(strlen(*pargv) + 2);
                                *pp = '-';
                                strcpy(pp + 1, *pargv);
                                *pargv = pp;