aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2020-08-21 13:54:32 +0100
committerRon Yorston <rmy@pobox.com>2020-08-21 13:54:32 +0100
commitd6b557547551dd80a389f361a995a97ef5930a63 (patch)
tree4f9502bc0b9b6b0f2df92a6d7e9ebb02ba491b92 /shell
parent90418d34c5517691fa78d90e632fa5f9f6b35c03 (diff)
downloadbusybox-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.c43
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 */
2110static char *
2111stack_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;