diff options
author | Ron Yorston <rmy@pobox.com> | 2022-10-26 11:47:42 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2022-10-26 11:47:42 +0100 |
commit | d71cb67ff91762ae78e87440b87d7c9a160b2937 (patch) | |
tree | e378f71776199ff4fe44cb3bc020a8f43278bd2b | |
parent | 0b5bd6e1436c38a74c5294535d5f4d7a7cf79d54 (diff) | |
download | busybox-w32-d71cb67ff91762ae78e87440b87d7c9a160b2937.tar.gz busybox-w32-d71cb67ff91762ae78e87440b87d7c9a160b2937.tar.bz2 busybox-w32-d71cb67ff91762ae78e87440b87d7c9a160b2937.zip |
win32: revert special treatment of Unix-style absolute paths
Commit 605972390 (win32: handle Unix-style absolute paths for
executables) added special treatment of paths for executables
starting with a slash. Such paths are absolute on Unix but are
relative to the current drive on Windows. On reflection this
commit did more than necessary. Later commits provided special
treatment only for paths starting with locations traditionally
used to contain binaries on Unix. This is probably sufficient.
Problems introduced by commit 605972390 include:
- If the current drive isn't the system drive tab completion of a
command starting with a slash confusingly references the system
drive.
- Building busybox-w32 with w64devkit fails on drives other than
the system drive.
Revert the changes introduced by commit 605972390.
This saves 192 bytes.
(GitHub issue #239)
-rw-r--r-- | debianutils/which.c | 6 | ||||
-rw-r--r-- | include/mingw.h | 2 | ||||
-rw-r--r-- | libbb/executable.c | 2 | ||||
-rw-r--r-- | libbb/lineedit.c | 3 | ||||
-rw-r--r-- | shell/ash.c | 45 | ||||
-rw-r--r-- | win32/mingw.c | 11 | ||||
-rw-r--r-- | win32/process.c | 4 |
7 files changed, 24 insertions, 49 deletions
diff --git a/debianutils/which.c b/debianutils/which.c index 4590653b3..b2cd4de18 100644 --- a/debianutils/which.c +++ b/debianutils/which.c | |||
@@ -12,9 +12,9 @@ | |||
12 | //config: which is used to find programs in your PATH and | 12 | //config: which is used to find programs in your PATH and |
13 | //config: print out their pathnames. | 13 | //config: print out their pathnames. |
14 | 14 | ||
15 | // NOTE: For WIN32 this applet is NOEXEC as alloc_system_drive() and | 15 | // NOTE: For WIN32 this applet is NOEXEC as alloc_ext_space() and |
16 | // find_executable() both allocate memory. And find_executable() | 16 | // find_executable() both allocate memory. And find_executable() |
17 | // calls alloc_system_drive(). | 17 | // calls alloc_ext_space(). |
18 | 18 | ||
19 | //applet:IF_PLATFORM_MINGW32(IF_WHICH(APPLET_NOEXEC(which, which, BB_DIR_USR_BIN, BB_SUID_DROP, which))) | 19 | //applet:IF_PLATFORM_MINGW32(IF_WHICH(APPLET_NOEXEC(which, which, BB_DIR_USR_BIN, BB_SUID_DROP, which))) |
20 | //applet:IF_PLATFORM_POSIX(IF_WHICH(APPLET_NOFORK(which, which, BB_DIR_USR_BIN, BB_SUID_DROP, which))) | 20 | //applet:IF_PLATFORM_POSIX(IF_WHICH(APPLET_NOFORK(which, which, BB_DIR_USR_BIN, BB_SUID_DROP, which))) |
@@ -87,7 +87,7 @@ int which_main(int argc UNUSED_PARAM, char **argv) | |||
87 | } | 87 | } |
88 | #else | 88 | #else |
89 | if (has_path(*argv)) { | 89 | if (has_path(*argv)) { |
90 | char *path = alloc_system_drive(*argv); | 90 | char *path = alloc_ext_space(*argv); |
91 | 91 | ||
92 | if (add_win32_extension(path) || file_is_executable(path)) { | 92 | if (add_win32_extension(path) || file_is_executable(path)) { |
93 | missing = 0; | 93 | missing = 0; |
diff --git a/include/mingw.h b/include/mingw.h index bfd6128e1..0357e4521 100644 --- a/include/mingw.h +++ b/include/mingw.h | |||
@@ -575,7 +575,7 @@ int unc_root_len(const char *dir); | |||
575 | int root_len(const char *path); | 575 | int root_len(const char *path); |
576 | const char *get_system_drive(void); | 576 | const char *get_system_drive(void); |
577 | const char *need_system_drive(const char *path); | 577 | const char *need_system_drive(const char *path); |
578 | char *alloc_system_drive(const char *path); | 578 | char *alloc_ext_space(const char *path); |
579 | int chdir_system_drive(void); | 579 | int chdir_system_drive(void); |
580 | char *xabsolute_path(char *path); | 580 | char *xabsolute_path(char *path); |
581 | char *get_drive_cwd(const char *path, char *buffer, int size); | 581 | char *get_drive_cwd(const char *path, char *buffer, int size); |
diff --git a/libbb/executable.c b/libbb/executable.c index 32b37f29d..770aedc0c 100644 --- a/libbb/executable.c +++ b/libbb/executable.c | |||
@@ -57,7 +57,7 @@ char* FAST_FUNC find_executable(const char *filename, char **PATHp) | |||
57 | ); | 57 | ); |
58 | #if ENABLE_PLATFORM_MINGW32 | 58 | #if ENABLE_PLATFORM_MINGW32 |
59 | { | 59 | { |
60 | char *w = alloc_system_drive(p); | 60 | char *w = alloc_ext_space(p); |
61 | ex = add_win32_extension(w) || file_is_executable(w); | 61 | ex = add_win32_extension(w) || file_is_executable(w); |
62 | free(p); | 62 | free(p); |
63 | p = w; | 63 | p = w; |
diff --git a/libbb/lineedit.c b/libbb/lineedit.c index c5d5808f5..b4950688e 100644 --- a/libbb/lineedit.c +++ b/libbb/lineedit.c | |||
@@ -972,9 +972,6 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type) | |||
972 | } | 972 | } |
973 | 973 | ||
974 | lpath = *paths[i] ? paths[i] : "."; | 974 | lpath = *paths[i] ? paths[i] : "."; |
975 | #if ENABLE_PLATFORM_MINGW32 | ||
976 | lpath = auto_string(alloc_system_drive(lpath)); | ||
977 | #endif | ||
978 | dir = opendir(lpath); | 975 | dir = opendir(lpath); |
979 | if (!dir) | 976 | if (!dir) |
980 | continue; /* don't print an error */ | 977 | continue; /* don't print an error */ |
diff --git a/shell/ash.c b/shell/ash.c index 8497538b1..13200da0c 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -2158,17 +2158,13 @@ maybe_single_quote(const char *s) | |||
2158 | } | 2158 | } |
2159 | 2159 | ||
2160 | #if ENABLE_PLATFORM_MINGW32 | 2160 | #if ENABLE_PLATFORM_MINGW32 |
2161 | /* | 2161 | /* Copy path to a string on the stack long enough to allow a file extension |
2162 | * Place 'path' in a string on the stack, adding the system drive prefix | 2162 | * to be added. */ |
2163 | * if necessary and leaving room for an optional extension. | ||
2164 | */ | ||
2165 | static char * | 2163 | static char * |
2166 | stack_add_system_drive(const char *path) | 2164 | stack_add_ext_space(const char *path) |
2167 | { | 2165 | { |
2168 | const char *sd = need_system_drive(path); | 2166 | char *p = growstackto(strlen(path) + 5); |
2169 | char *p = growstackto(strlen(path) + 5 + (sd ? strlen(sd) : 0)); | 2167 | strcpy(p, path); |
2170 | |||
2171 | strcpy(stpcpy(p, sd ?: ""), path); | ||
2172 | return p; | 2168 | return p; |
2173 | } | 2169 | } |
2174 | #endif | 2170 | #endif |
@@ -2947,10 +2943,6 @@ padvance_magic(const char **path, const char *name, int magic) | |||
2947 | const char *start; | 2943 | const char *start; |
2948 | size_t qlen; | 2944 | size_t qlen; |
2949 | size_t len; | 2945 | size_t len; |
2950 | #if ENABLE_PLATFORM_MINGW32 | ||
2951 | size_t sdlen = 0; | ||
2952 | const char *sd; | ||
2953 | #endif | ||
2954 | 2946 | ||
2955 | if (*path == NULL) | 2947 | if (*path == NULL) |
2956 | return -1; | 2948 | return -1; |
@@ -2982,20 +2974,11 @@ padvance_magic(const char **path, const char *name, int magic) | |||
2982 | *path = *p == PATH_SEP ? p + 1 : NULL; | 2974 | *path = *p == PATH_SEP ? p + 1 : NULL; |
2983 | 2975 | ||
2984 | /* "2" is for '/' and '\0' */ | 2976 | /* "2" is for '/' and '\0' */ |
2985 | qlen = len + strlen(name) + 2; | 2977 | /* reserve space for suffix on WIN32 */ |
2986 | #if ENABLE_PLATFORM_MINGW32 | 2978 | qlen = len + strlen(name) + 2 IF_PLATFORM_MINGW32(+ 4); |
2987 | /* reserve space for system drive prefix and extension */ | ||
2988 | sd = need_system_drive(start); | ||
2989 | if (sd != NULL) | ||
2990 | sdlen = strlen(sd); | ||
2991 | qlen += 4 + sdlen; | ||
2992 | #endif | ||
2993 | q = growstackto(qlen); | 2979 | q = growstackto(qlen); |
2994 | 2980 | ||
2995 | if (len) { | 2981 | if (len) { |
2996 | #if ENABLE_PLATFORM_MINGW32 | ||
2997 | q = mempcpy(q, sd, sdlen); | ||
2998 | #endif | ||
2999 | q = mempcpy(q, start, len); | 2982 | q = mempcpy(q, start, len); |
3000 | #if ENABLE_PLATFORM_MINGW32 | 2983 | #if ENABLE_PLATFORM_MINGW32 |
3001 | if (q[-1] != '/' && q[-1] != '\\') | 2984 | if (q[-1] != '/' && q[-1] != '\\') |
@@ -9058,10 +9041,6 @@ static void shellexec(char *prog, char **argv, const char *path, int idx) | |||
9058 | || (applet_no = find_applet_by_name(prog)) >= 0 | 9041 | || (applet_no = find_applet_by_name(prog)) >= 0 |
9059 | #endif | 9042 | #endif |
9060 | ) { | 9043 | ) { |
9061 | #if ENABLE_PLATFORM_MINGW32 | ||
9062 | char *oldprog = prog; | ||
9063 | prog = stack_add_system_drive(prog); | ||
9064 | #endif | ||
9065 | tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp); | 9044 | tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp); |
9066 | if (applet_no >= 0) { | 9045 | if (applet_no >= 0) { |
9067 | /* We tried execing ourself, but it didn't work. | 9046 | /* We tried execing ourself, but it didn't work. |
@@ -9072,15 +9051,15 @@ static void shellexec(char *prog, char **argv, const char *path, int idx) | |||
9072 | } | 9051 | } |
9073 | e = errno; | 9052 | e = errno; |
9074 | #if ENABLE_PLATFORM_MINGW32 | 9053 | #if ENABLE_PLATFORM_MINGW32 |
9075 | if (unix_path(oldprog) && !find_builtin(bb_basename(oldprog))) { | 9054 | if (unix_path(prog) && !find_builtin(bb_basename(prog))) { |
9076 | # if ENABLE_FEATURE_SH_STANDALONE | 9055 | # if ENABLE_FEATURE_SH_STANDALONE |
9077 | const char *name = bb_basename(oldprog); | 9056 | const char *name = bb_basename(prog); |
9078 | if ((applet_no = find_applet_by_name(name)) >= 0) { | 9057 | if ((applet_no = find_applet_by_name(name)) >= 0) { |
9079 | tryexec(applet_no, name, argv, envp); | 9058 | tryexec(applet_no, name, argv, envp); |
9080 | e = errno; | 9059 | e = errno; |
9081 | } | 9060 | } |
9082 | # endif | 9061 | # endif |
9083 | argv[0] = (char *)bb_basename(oldprog); | 9062 | argv[0] = (char *)bb_basename(prog); |
9084 | goto try_PATH; | 9063 | goto try_PATH; |
9085 | } | 9064 | } |
9086 | #endif | 9065 | #endif |
@@ -9523,7 +9502,7 @@ describe_command(char *command, const char *path, int describe_command_verbose) | |||
9523 | #endif | 9502 | #endif |
9524 | if (j < 0) { | 9503 | if (j < 0) { |
9525 | #if ENABLE_PLATFORM_MINGW32 | 9504 | #if ENABLE_PLATFORM_MINGW32 |
9526 | p = stack_add_system_drive(command); | 9505 | p = stack_add_ext_space(command); |
9527 | #else | 9506 | #else |
9528 | p = command; | 9507 | p = command; |
9529 | #endif | 9508 | #endif |
@@ -14720,7 +14699,7 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path) | |||
14720 | if (has_path(name)) { | 14699 | if (has_path(name)) { |
14721 | entry->u.index = -1; | 14700 | entry->u.index = -1; |
14722 | entry->cmdtype = CMDNORMAL; | 14701 | entry->cmdtype = CMDNORMAL; |
14723 | fullname = stack_add_system_drive(name); | 14702 | fullname = stack_add_ext_space(name); |
14724 | if (add_win32_extension(fullname) || file_is_executable(fullname)) { | 14703 | if (add_win32_extension(fullname) || file_is_executable(fullname)) { |
14725 | return; | 14704 | return; |
14726 | } else if (unix_path(name) && !find_builtin(bb_basename(name))) { | 14705 | } else if (unix_path(name) && !find_builtin(bb_basename(name))) { |
diff --git a/win32/mingw.c b/win32/mingw.c index d5d944a9d..606a48319 100644 --- a/win32/mingw.c +++ b/win32/mingw.c | |||
@@ -2142,13 +2142,12 @@ const char *need_system_drive(const char *path) | |||
2142 | return NULL; | 2142 | return NULL; |
2143 | } | 2143 | } |
2144 | 2144 | ||
2145 | /* Allocate a string long enough to allow a system drive prefix and | 2145 | /* Copy path to an allocated string long enough to allow a file extension |
2146 | * file extension to be added to path. Add the prefix if necessary. */ | 2146 | * to be added. */ |
2147 | char *alloc_system_drive(const char *path) | 2147 | char *alloc_ext_space(const char *path) |
2148 | { | 2148 | { |
2149 | const char *sd = need_system_drive(path); | 2149 | char *s = xmalloc(strlen(path) + 5); |
2150 | char *s = xmalloc(strlen(path) + 5 + (sd ? strlen(sd) : 0)); | 2150 | strcpy(s, path); |
2151 | strcpy(stpcpy(s, sd ?: ""), path); | ||
2152 | return s; | 2151 | return s; |
2153 | } | 2152 | } |
2154 | 2153 | ||
diff --git a/win32/process.c b/win32/process.c index 6ab0d8735..d78041251 100644 --- a/win32/process.c +++ b/win32/process.c | |||
@@ -328,7 +328,7 @@ mingw_spawn_interpreter(int mode, const char *prog, char *const *argv, | |||
328 | } | 328 | } |
329 | #endif | 329 | #endif |
330 | 330 | ||
331 | path = alloc_system_drive(interp.path); | 331 | path = alloc_ext_space(interp.path); |
332 | if ((add_win32_extension(path) || file_is_executable(path))) { | 332 | if ((add_win32_extension(path) || file_is_executable(path))) { |
333 | new_argv[0] = path; | 333 | new_argv[0] = path; |
334 | ret = mingw_spawn_interpreter(mode, path, new_argv, envp, level); | 334 | ret = mingw_spawn_interpreter(mode, path, new_argv, envp, level); |
@@ -363,7 +363,7 @@ mingw_spawnvp(int mode, const char *cmd, char *const *argv) | |||
363 | return mingw_spawn_applet(mode, argv, NULL); | 363 | return mingw_spawn_applet(mode, argv, NULL); |
364 | #endif | 364 | #endif |
365 | if (has_path(cmd)) { | 365 | if (has_path(cmd)) { |
366 | path = alloc_system_drive(cmd); | 366 | path = alloc_ext_space(cmd); |
367 | if (add_win32_extension(path) || file_is_executable(path)) { | 367 | if (add_win32_extension(path) || file_is_executable(path)) { |
368 | ret = mingw_spawn_interpreter(mode, path, argv, NULL, 0); | 368 | ret = mingw_spawn_interpreter(mode, path, argv, NULL, 0); |
369 | free(path); | 369 | free(path); |