udhcpc: code shrink
[oweals/busybox.git] / debianutils / which.c
index b31d6187172fb56f221ec3411b4fd2306aff67cf..02f77a216ae675051a6a4872b8cbb3334bad98ac 100644 (file)
 int which_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int which_main(int argc UNUSED_PARAM, char **argv)
 {
-       const char *env_path;
+       char *env_path;
        int status = 0;
+       /* This sizeof(): bb_default_root_path is shorter than BB_PATH_ROOT_PATH */
+       char buf[sizeof(BB_PATH_ROOT_PATH)];
 
        env_path = getenv("PATH");
        if (!env_path)
-               env_path = bb_default_root_path;
+               /* env_path must be writable, and must not alloc, so... */
+               env_path = strcpy(buf, bb_default_root_path);
 
-       opt_complementary = "-1"; /* at least one argument */
-       getopt32(argv, "a");
+       getopt32(argv, "^" "a" "\0" "-1"/*at least one arg*/);
        argv += optind;
 
        do {
@@ -52,20 +54,17 @@ int which_main(int argc UNUSED_PARAM, char **argv)
                        }
                } else {
                        char *path;
-                       char *tmp;
                        char *p;
 
-                       path = tmp = xstrdup(env_path);
-//NOFORK FIXME: nested xmallocs (one is inside find_executable())
-//can leak memory on failure
-                       while ((p = find_executable(*argv, &tmp)) != NULL) {
+                       path = env_path;
+                       /* NOFORK NB: xmalloc inside find_executable(), must have no allocs above! */
+                       while ((p = find_executable(*argv, &path)) != NULL) {
                                missing = 0;
                                puts(p);
                                free(p);
                                if (!option_mask32) /* -a not set */
                                        break;
                        }
-                       free(path);
                }
                status |= missing;
        } while (*++argv);