diff options
-rw-r--r-- | libbb/execable.c | 18 | ||||
-rw-r--r-- | win32/process.c | 4 |
2 files changed, 17 insertions, 5 deletions
diff --git a/libbb/execable.c b/libbb/execable.c index 96ce9bfb8..06b1c534b 100644 --- a/libbb/execable.c +++ b/libbb/execable.c | |||
@@ -18,8 +18,11 @@ int FAST_FUNC execable_file(const char *name) | |||
18 | struct stat s; | 18 | struct stat s; |
19 | if (ENABLE_PLATFORM_MINGW32) { | 19 | if (ENABLE_PLATFORM_MINGW32) { |
20 | int len = strlen(name); | 20 | int len = strlen(name); |
21 | return len > 4 && !strcasecmp(name+len-4, ".exe") && | 21 | return len > 4 && |
22 | !stat(name, &s) && S_ISREG(s.st_mode); | 22 | (!strcasecmp(name+len-4, ".exe") || |
23 | !strcasecmp(name+len-4, ".com")) && | ||
24 | !stat(name, &s) && | ||
25 | S_ISREG(s.st_mode); | ||
23 | } | 26 | } |
24 | return (!access(name, X_OK) && !stat(name, &s) && S_ISREG(s.st_mode)); | 27 | return (!access(name, X_OK) && !stat(name, &s) && S_ISREG(s.st_mode)); |
25 | } | 28 | } |
@@ -43,7 +46,7 @@ char* FAST_FUNC find_execable(const char *filename, char **PATHp) | |||
43 | 46 | ||
44 | p = *PATHp; | 47 | p = *PATHp; |
45 | while (p) { | 48 | while (p) { |
46 | n = next_path_sep(p); | 49 | n = (char*)next_path_sep(p); |
47 | if (n) | 50 | if (n) |
48 | *n++ = '\0'; | 51 | *n++ = '\0'; |
49 | if (*p != '\0') { /* it's not a PATH="foo::bar" situation */ | 52 | if (*p != '\0') { /* it's not a PATH="foo::bar" situation */ |
@@ -54,7 +57,9 @@ char* FAST_FUNC find_execable(const char *filename, char **PATHp) | |||
54 | } | 57 | } |
55 | if (ENABLE_PLATFORM_MINGW32) { | 58 | if (ENABLE_PLATFORM_MINGW32) { |
56 | int len = strlen(p); | 59 | int len = strlen(p); |
57 | if (len > 4 && !strcasecmp(p+len-4, ".exe")) | 60 | if (len > 4 && |
61 | (!strcasecmp(p+len-4, ".exe") || | ||
62 | !strcasecmp(p+len-4, ".com"))) | ||
58 | ; /* nothing, already tested by find_execable() */ | 63 | ; /* nothing, already tested by find_execable() */ |
59 | else { | 64 | else { |
60 | char *np = xmalloc(len+4+1); | 65 | char *np = xmalloc(len+4+1); |
@@ -64,6 +69,11 @@ char* FAST_FUNC find_execable(const char *filename, char **PATHp) | |||
64 | *PATHp = n; | 69 | *PATHp = n; |
65 | return np; | 70 | return np; |
66 | } | 71 | } |
72 | memcpy(np+len, ".com", 5); | ||
73 | if (execable_file(np)) { | ||
74 | *PATHp = n; | ||
75 | return np; | ||
76 | } | ||
67 | } | 77 | } |
68 | } | 78 | } |
69 | free(p); | 79 | free(p); |
diff --git a/win32/process.c b/win32/process.c index 0936e1c42..13bf81797 100644 --- a/win32/process.c +++ b/win32/process.c | |||
@@ -38,7 +38,9 @@ parse_interpreter(const char *cmd) | |||
38 | 38 | ||
39 | /* don't even try a .exe */ | 39 | /* don't even try a .exe */ |
40 | n = strlen(cmd); | 40 | n = strlen(cmd); |
41 | if (n >= 4 && !strcasecmp(cmd+n-4, ".exe")) | 41 | if (n >= 4 && |
42 | (!strcasecmp(cmd+n-4, ".exe") || | ||
43 | !strcasecmp(cmd+n-4, ".com"))) | ||
42 | return NULL; | 44 | return NULL; |
43 | 45 | ||
44 | fd = open(cmd, O_RDONLY); | 46 | fd = open(cmd, O_RDONLY); |