diff options
Diffstat (limited to 'debianutils/which.c')
-rw-r--r-- | debianutils/which.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/debianutils/which.c b/debianutils/which.c index 3bd54ac42..02f77a216 100644 --- a/debianutils/which.c +++ b/debianutils/which.c | |||
@@ -30,12 +30,15 @@ | |||
30 | int which_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 30 | int which_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
31 | int which_main(int argc UNUSED_PARAM, char **argv) | 31 | int which_main(int argc UNUSED_PARAM, char **argv) |
32 | { | 32 | { |
33 | const char *env_path; | 33 | char *env_path; |
34 | int status = 0; | 34 | int status = 0; |
35 | /* This sizeof(): bb_default_root_path is shorter than BB_PATH_ROOT_PATH */ | ||
36 | char buf[sizeof(BB_PATH_ROOT_PATH)]; | ||
35 | 37 | ||
36 | env_path = getenv("PATH"); | 38 | env_path = getenv("PATH"); |
37 | if (!env_path) | 39 | if (!env_path) |
38 | env_path = bb_default_root_path; | 40 | /* env_path must be writable, and must not alloc, so... */ |
41 | env_path = strcpy(buf, bb_default_root_path); | ||
39 | 42 | ||
40 | getopt32(argv, "^" "a" "\0" "-1"/*at least one arg*/); | 43 | getopt32(argv, "^" "a" "\0" "-1"/*at least one arg*/); |
41 | argv += optind; | 44 | argv += optind; |
@@ -51,20 +54,17 @@ int which_main(int argc UNUSED_PARAM, char **argv) | |||
51 | } | 54 | } |
52 | } else { | 55 | } else { |
53 | char *path; | 56 | char *path; |
54 | char *tmp; | ||
55 | char *p; | 57 | char *p; |
56 | 58 | ||
57 | path = tmp = xstrdup(env_path); | 59 | path = env_path; |
58 | //NOFORK FIXME: nested xmallocs (one is inside find_executable()) | 60 | /* NOFORK NB: xmalloc inside find_executable(), must have no allocs above! */ |
59 | //can leak memory on failure | 61 | while ((p = find_executable(*argv, &path)) != NULL) { |
60 | while ((p = find_executable(*argv, &tmp)) != NULL) { | ||
61 | missing = 0; | 62 | missing = 0; |
62 | puts(p); | 63 | puts(p); |
63 | free(p); | 64 | free(p); |
64 | if (!option_mask32) /* -a not set */ | 65 | if (!option_mask32) /* -a not set */ |
65 | break; | 66 | break; |
66 | } | 67 | } |
67 | free(path); | ||
68 | } | 68 | } |
69 | status |= missing; | 69 | status |= missing; |
70 | } while (*++argv); | 70 | } while (*++argv); |