- don't free user-supplied string (via -e)
[oweals/busybox.git] / libbb / getopt32.c
index cd890323e41c48edcb12b3f550d88e1406954216..9dba44db26cd05d9484db562d003a195533f2d85 100644 (file)
@@ -137,7 +137,7 @@ const char *opt_complementary
         opt_complementary = "vv:b::b-c:c-b";
         f = getopt32(argv, "vb:c", &my_b, &verbose_level);
         if (f & 2)       // -c after -b unsets -b flag
-                while (my_b) { dosomething_with(my_b->data); my_b = my_b->link; }
+                while (my_b) dosomething_with(llist_pop(&my_b));
         if (my_b)        // but llist is stored if -b is specified
                 free_llist(my_b);
         if (verbose_level) printf("verbose level is %d\n", verbose_level);
@@ -316,7 +316,7 @@ const char *applet_long_options;
 
 uint32_t option_mask32;
 
-uint32_t
+uint32_t FAST_FUNC
 getopt32(char **argv, const char *applet_opts, ...)
 {
        int argc;
@@ -494,15 +494,15 @@ getopt32(char **argv, const char *applet_opts, ...)
        va_end(p);
 
        if (spec_flgs & FIRST_ARGV_IS_OPT) {
-               if (argv[1] && argv[1][0] != '-' && argv[1][1] != '\0') {
+               if (argv[1] && argv[1][0] != '-' && argv[1][0] != '\0') {
 #if DONT_USE_PRINTF
                        char *pp = alloca(strlen(argv[1]) + 2);
-                       *pp++ = '-';
-                       argv[1] = strcpy(pp, argv[1]);
+                       *pp = '-';
+                       strcpy(pp + 1, argv[1]);
+                       argv[1] = pp;
 #else
                        argv[1] = xasprintf("-%s", argv[1]);
-                       if (ENABLE_FEATURE_CLEAN_UP)
-                               spec_flgs |= FREE_FIRST_ARGV_IS_OPT;
+                       spec_flgs |= FREE_FIRST_ARGV_IS_OPT;
 #endif
                }
        }
@@ -585,10 +585,9 @@ getopt32(char **argv, const char *applet_opts, ...)
                }
        }
 
-#if ENABLE_FEATURE_CLEAN_UP
        if (spec_flgs & FREE_FIRST_ARGV_IS_OPT)
                free(argv[1]);
-#endif
+
        /* check depending requires for given options */
        for (on_off = complementary; on_off->opt_char; on_off++) {
                if (on_off->requires && (flags & on_off->switch_on) &&