diff options
-rw-r--r-- | debianutils/which.c | 11 | ||||
-rw-r--r-- | libbb/executable.c | 12 | ||||
-rw-r--r-- | win32/process.c | 34 |
3 files changed, 36 insertions, 21 deletions
diff --git a/debianutils/which.c b/debianutils/which.c index 9060a5b47..0b0a6a645 100644 --- a/debianutils/which.c +++ b/debianutils/which.c | |||
@@ -66,17 +66,18 @@ int which_main(int argc UNUSED_PARAM, char **argv) | |||
66 | 66 | ||
67 | /* If file contains a slash don't use PATH */ | 67 | /* If file contains a slash don't use PATH */ |
68 | if (strchr(*argv, '/') || (ENABLE_PLATFORM_MINGW32 && strchr(*argv, '\\'))) { | 68 | if (strchr(*argv, '/') || (ENABLE_PLATFORM_MINGW32 && strchr(*argv, '\\'))) { |
69 | if (file_is_executable(*argv)) { | ||
70 | missing = 0; | ||
71 | puts(*argv); | ||
72 | } | ||
73 | #if ENABLE_PLATFORM_MINGW32 | 69 | #if ENABLE_PLATFORM_MINGW32 |
74 | else if ((p=add_win32_extension(*argv)) != NULL) { | 70 | if ((p=add_win32_extension(*argv)) != NULL) { |
75 | missing = 0; | 71 | missing = 0; |
76 | puts(p); | 72 | puts(p); |
77 | free(p); | 73 | free(p); |
78 | } | 74 | } |
75 | else | ||
79 | #endif | 76 | #endif |
77 | if (file_is_executable(*argv)) { | ||
78 | missing = 0; | ||
79 | puts(*argv); | ||
80 | } | ||
80 | } else { | 81 | } else { |
81 | char *path; | 82 | char *path; |
82 | 83 | ||
diff --git a/libbb/executable.c b/libbb/executable.c index 76b10f790..aec829945 100644 --- a/libbb/executable.c +++ b/libbb/executable.c | |||
@@ -66,23 +66,23 @@ char* FAST_FUNC find_executable(const char *filename, char **PATHp) | |||
66 | p[0] ? p : ".", /* handle "::" case */ | 66 | p[0] ? p : ".", /* handle "::" case */ |
67 | filename | 67 | filename |
68 | ); | 68 | ); |
69 | ex = file_is_executable(p); | ||
70 | #if ENABLE_PLATFORM_MINGW32 | 69 | #if ENABLE_PLATFORM_MINGW32 |
71 | if (n) *n++ = sep; | 70 | if (n) *n++ = sep; |
72 | #else | 71 | #else |
73 | if (n) *n++ = ':'; | 72 | if (n) *n++ = ':'; |
74 | #endif | 73 | #endif |
75 | if (ex) { | ||
76 | *PATHp = n; | ||
77 | return p; | ||
78 | } | ||
79 | #if ENABLE_PLATFORM_MINGW32 | 74 | #if ENABLE_PLATFORM_MINGW32 |
80 | else if ((w=add_win32_extension(p))) { | 75 | if ((w=add_win32_extension(p))) { |
81 | *PATHp = n; | 76 | *PATHp = n; |
82 | free(p); | 77 | free(p); |
83 | return w; | 78 | return w; |
84 | } | 79 | } |
85 | #endif | 80 | #endif |
81 | ex = file_is_executable(p); | ||
82 | if (ex) { | ||
83 | *PATHp = n; | ||
84 | return p; | ||
85 | } | ||
86 | free(p); | 86 | free(p); |
87 | p = n; | 87 | p = n; |
88 | } /* on loop exit p == NULL */ | 88 | } /* on loop exit p == NULL */ |
diff --git a/win32/process.c b/win32/process.c index eda143e0e..96561c482 100644 --- a/win32/process.c +++ b/win32/process.c | |||
@@ -195,6 +195,23 @@ spawnveq(int mode, const char *path, char *const *argv, char *const *env) | |||
195 | char *new_path = NULL; | 195 | char *new_path = NULL; |
196 | int i, argc = -1; | 196 | int i, argc = -1; |
197 | intptr_t ret; | 197 | intptr_t ret; |
198 | struct stat st; | ||
199 | |||
200 | /* | ||
201 | * Require that the file exists, is a regular file and is executable. | ||
202 | * It may still contain garbage but we let spawnve deal with that. | ||
203 | */ | ||
204 | if (stat(path, &st) == 0) { | ||
205 | if (!S_ISREG(st.st_mode) || !(st.st_mode&S_IXUSR)) { | ||
206 | errno = EACCES; | ||
207 | fprintf(stderr, "spawnveq: %s: %s\n", path, strerror(errno)); | ||
208 | return -1; | ||
209 | } | ||
210 | } | ||
211 | else { | ||
212 | fprintf(stderr, "spawnveq: %s: %s\n", path, strerror(errno)); | ||
213 | return -1; | ||
214 | } | ||
198 | 215 | ||
199 | while (argv[++argc]) | 216 | while (argv[++argc]) |
200 | ; | 217 | ; |
@@ -233,15 +250,12 @@ spawnveq(int mode, const char *path, char *const *argv, char *const *env) | |||
233 | } | 250 | } |
234 | 251 | ||
235 | /* | 252 | /* |
236 | * Another special case: if a binary executable doesn't have an | 253 | * Another special case: if a file doesn't have an extension add |
237 | * extension spawnve will only run it if the filename ends with a '.'. | 254 | * a '.' at the end. This forces spawnve to use precisely the |
255 | * file specified without trying to add an extension. | ||
238 | */ | 256 | */ |
239 | if (!has_exe_suffix(path)) { | 257 | if (!strchr(bb_basename(path), '.')) { |
240 | int len = strlen(path); | 258 | new_path = xasprintf("%s.", path); |
241 | |||
242 | if (path[len-1] != '.' && has_exec_format(path)) { | ||
243 | new_path = xasprintf("%s.", path); | ||
244 | } | ||
245 | } | 259 | } |
246 | 260 | ||
247 | ret = spawnve(mode, new_path ? new_path : path, new_argv, env); | 261 | ret = spawnve(mode, new_path ? new_path : path, new_argv, env); |
@@ -288,8 +302,8 @@ mingw_spawn_interpreter(int mode, const char *prog, char *const *argv, char *con | |||
288 | new_argv[nopts+1] = (char *)prog; /* pass absolute path */ | 302 | new_argv[nopts+1] = (char *)prog; /* pass absolute path */ |
289 | memcpy(new_argv+nopts+2, argv+1, sizeof(*argv)*argc); | 303 | memcpy(new_argv+nopts+2, argv+1, sizeof(*argv)*argc); |
290 | 304 | ||
291 | if (file_is_executable(int_path) || | 305 | if ((fullpath=add_win32_extension(int_path)) != NULL || |
292 | (fullpath=add_win32_extension(int_path)) != NULL) { | 306 | file_is_executable(int_path)) { |
293 | new_argv[0] = fullpath ? fullpath : int_path; | 307 | new_argv[0] = fullpath ? fullpath : int_path; |
294 | ret = spawnveq(mode, new_argv[0], new_argv, envp); | 308 | ret = spawnveq(mode, new_argv[0], new_argv, envp); |
295 | } else | 309 | } else |