summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shell/ash.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/shell/ash.c b/shell/ash.c
index b4ed8e5..d197fa1 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -7471,9 +7471,7 @@ shellexec(char **argv, const char *path, int idx)
int e;
char **envp;
int exerrno;
-#if ENABLE_FEATURE_SH_STANDALONE
- int applet_no = -1;
-#endif
+ int applet_no = -1; /* used only by FEATURE_SH_STANDALONE */
clearredir(/*drop:*/ 1);
envp = listvars(VEXPORT, VUNSET, /*end:*/ NULL);
@@ -7483,8 +7481,16 @@ shellexec(char **argv, const char *path, int idx)
#endif
) {
tryexec(IF_FEATURE_SH_STANDALONE(applet_no,) argv[0], argv, envp);
+ if (applet_no >= 0) {
+ /* We tried execing ourself, but it didn't work.
+ * Maybe /proc/self/exe doesn't exist?
+ * Try $PATH search.
+ */
+ goto try_PATH;
+ }
e = errno;
} else {
+ try_PATH:
e = ENOENT;
while ((cmdname = path_advance(&path, argv[0])) != NULL) {
if (--idx < 0 && pathopt == NULL) {