diff options
author | Ron Yorston <rmy@pobox.com> | 2020-08-21 13:54:32 +0100 |
---|---|---|
committer | Ron Yorston <rmy@pobox.com> | 2020-08-21 13:54:32 +0100 |
commit | d6b557547551dd80a389f361a995a97ef5930a63 (patch) | |
tree | 4f9502bc0b9b6b0f2df92a6d7e9ebb02ba491b92 /shell | |
parent | 90418d34c5517691fa78d90e632fa5f9f6b35c03 (diff) | |
download | busybox-w32-d6b557547551dd80a389f361a995a97ef5930a63.tar.gz busybox-w32-d6b557547551dd80a389f361a995a97ef5930a63.tar.bz2 busybox-w32-d6b557547551dd80a389f361a995a97ef5930a63.zip |
ash: use stack, not heap, to add system drive to path
Make the code a bit tidier, no change to functionality or size.
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/shell/ash.c b/shell/ash.c index 2267e841f..abefba074 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -2102,6 +2102,22 @@ maybe_single_quote(const char *s) | |||
2102 | return single_quote(s); | 2102 | return single_quote(s); |
2103 | } | 2103 | } |
2104 | 2104 | ||
2105 | #if ENABLE_PLATFORM_MINGW32 | ||
2106 | /* | ||
2107 | * Place 'path' in a string on the stack, adding the system drive prefix | ||
2108 | * if necessary and leaving room for an optional extension. | ||
2109 | */ | ||
2110 | static char * | ||
2111 | stack_add_system_drive(const char *path) | ||
2112 | { | ||
2113 | const char *sd = need_system_drive(path); | ||
2114 | char *p = growstackto(strlen(path) + 5 + (sd ? strlen(sd) : 0)); | ||
2115 | |||
2116 | sprintf(p, "%s%s", sd ?: "", path); | ||
2117 | return p; | ||
2118 | } | ||
2119 | #endif | ||
2120 | |||
2105 | 2121 | ||
2106 | /* ============ nextopt */ | 2122 | /* ============ nextopt */ |
2107 | 2123 | ||
@@ -8687,10 +8703,11 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,) const char *cmd, char **argv, c | |||
8687 | #endif | 8703 | #endif |
8688 | 8704 | ||
8689 | #if ENABLE_PLATFORM_MINGW32 | 8705 | #if ENABLE_PLATFORM_MINGW32 |
8690 | cmd = auto_win32_extension(cmd) ?: cmd; | 8706 | /* cmd was allocated on the stack with room for an extension */ |
8707 | add_win32_extension((char *)cmd); | ||
8691 | execve(cmd, argv, envp); | 8708 | execve(cmd, argv, envp); |
8692 | /* skip POSIX-mandated retry on ENOEXEC */ | 8709 | /* skip POSIX-mandated retry on ENOEXEC */ |
8693 | #else | 8710 | #else /* !ENABLE_PLATFORM_MINGW32 */ |
8694 | repeat: | 8711 | repeat: |
8695 | #ifdef SYSV | 8712 | #ifdef SYSV |
8696 | do { | 8713 | do { |
@@ -8726,7 +8743,7 @@ tryexec(IF_FEATURE_SH_STANDALONE(int applet_no,) const char *cmd, char **argv, c | |||
8726 | argv[0] = (char*) "ash"; | 8743 | argv[0] = (char*) "ash"; |
8727 | goto repeat; | 8744 | goto repeat; |
8728 | } | 8745 | } |
8729 | #endif /* ENABLE_PLATFORM_MINGW32 */ | 8746 | #endif /* !ENABLE_PLATFORM_MINGW32 */ |
8730 | } | 8747 | } |
8731 | 8748 | ||
8732 | /* | 8749 | /* |
@@ -8757,7 +8774,7 @@ static void shellexec(char *prog, char **argv, const char *path, int idx) | |||
8757 | # if ENABLE_FEATURE_SH_STANDALONE | 8774 | # if ENABLE_FEATURE_SH_STANDALONE |
8758 | char *oldprog = prog; | 8775 | char *oldprog = prog; |
8759 | # endif | 8776 | # endif |
8760 | prog = auto_add_system_drive(prog); | 8777 | prog = stack_add_system_drive(prog); |
8761 | #endif | 8778 | #endif |
8762 | tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp); | 8779 | tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) prog, argv, envp); |
8763 | if (applet_no >= 0) { | 8780 | if (applet_no >= 0) { |
@@ -8768,7 +8785,7 @@ static void shellexec(char *prog, char **argv, const char *path, int idx) | |||
8768 | goto try_PATH; | 8785 | goto try_PATH; |
8769 | } | 8786 | } |
8770 | #if ENABLE_PLATFORM_MINGW32 && ENABLE_FEATURE_SH_STANDALONE | 8787 | #if ENABLE_PLATFORM_MINGW32 && ENABLE_FEATURE_SH_STANDALONE |
8771 | if (oldprog != prog && unix_path(oldprog)) { | 8788 | if (strcmp(oldprog, prog) != 0 && unix_path(oldprog)) { |
8772 | if ((applet_no = find_applet_by_name(bb_basename(oldprog))) >= 0) | 8789 | if ((applet_no = find_applet_by_name(bb_basename(oldprog))) >= 0) |
8773 | tryexec(applet_no, bb_basename(oldprog), argv, envp); | 8790 | tryexec(applet_no, bb_basename(oldprog), argv, envp); |
8774 | else | 8791 | else |
@@ -9210,12 +9227,7 @@ describe_command(char *command, const char *path, int describe_command_verbose) | |||
9210 | #endif | 9227 | #endif |
9211 | if (j < 0) { | 9228 | if (j < 0) { |
9212 | #if ENABLE_PLATFORM_MINGW32 | 9229 | #if ENABLE_PLATFORM_MINGW32 |
9213 | /* can't use auto_add_system_drive, need space for extension */ | 9230 | p = stack_add_system_drive(command); |
9214 | const char *sd = need_system_drive(command); | ||
9215 | size_t len = strlen(command) + 5 + (sd ? strlen(sd) : 0); | ||
9216 | |||
9217 | p = auto_string(xmalloc(len)); | ||
9218 | sprintf(p, "%s%s", sd ? sd : "", command); | ||
9219 | #else | 9231 | #else |
9220 | p = command; | 9232 | p = command; |
9221 | #endif | 9233 | #endif |
@@ -14307,16 +14319,15 @@ find_command(char *name, struct cmdentry *entry, int act, const char *path) | |||
14307 | /* If name contains a slash or drive prefix, don't use PATH or hash table */ | 14319 | /* If name contains a slash or drive prefix, don't use PATH or hash table */ |
14308 | if (has_path(name)) { | 14320 | if (has_path(name)) { |
14309 | # if ENABLE_FEATURE_SH_STANDALONE | 14321 | # if ENABLE_FEATURE_SH_STANDALONE |
14310 | char *oldname = name; | 14322 | char *oldname = name; |
14311 | # endif | 14323 | # endif |
14312 | name = auto_add_system_drive(name); | 14324 | name = stack_add_system_drive(name); |
14313 | entry->u.index = -1; | 14325 | entry->u.index = -1; |
14314 | if (act & DO_ABS) { | 14326 | if (act & DO_ABS) { |
14315 | if (auto_win32_extension(name) == NULL && stat(name, &statb) < 0) { | 14327 | if (!add_win32_extension(name) && stat(name, &statb) < 0) { |
14316 | # if ENABLE_FEATURE_SH_STANDALONE | 14328 | # if ENABLE_FEATURE_SH_STANDALONE |
14317 | int applet_no; | ||
14318 | if (unix_path(oldname) && | 14329 | if (unix_path(oldname) && |
14319 | (applet_no = find_applet_by_name(bb_basename(oldname))) >= 0) { | 14330 | find_applet_by_name(bb_basename(oldname)) >= 0) { |
14320 | entry->cmdtype = CMDNORMAL; | 14331 | entry->cmdtype = CMDNORMAL; |
14321 | entry->u.index = INT_MIN; | 14332 | entry->u.index = INT_MIN; |
14322 | return; | 14333 | return; |