Avoid calling exit() from within fork/vfork'ed processes.
-Erik
This commit is contained in:
parent
a920871c3a
commit
6f2ebcaa01
10
shell/lash.c
10
shell/lash.c
@ -1214,7 +1214,7 @@ static int pseudo_exec(struct child_prog *child)
|
|||||||
*/
|
*/
|
||||||
for (x = bltins; x->cmd; x++) {
|
for (x = bltins; x->cmd; x++) {
|
||||||
if (strcmp(child->argv[0], x->cmd) == 0 ) {
|
if (strcmp(child->argv[0], x->cmd) == 0 ) {
|
||||||
exit(x->function(child));
|
_exit(x->function(child));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1222,7 +1222,7 @@ static int pseudo_exec(struct child_prog *child)
|
|||||||
for (x = bltins_forking; x->cmd; x++) {
|
for (x = bltins_forking; x->cmd; x++) {
|
||||||
if (strcmp(child->argv[0], x->cmd) == 0) {
|
if (strcmp(child->argv[0], x->cmd) == 0) {
|
||||||
applet_name=x->cmd;
|
applet_name=x->cmd;
|
||||||
exit (x->function(child));
|
_exit (x->function(child));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
|
#ifdef CONFIG_FEATURE_SH_STANDALONE_SHELL
|
||||||
@ -1258,7 +1258,11 @@ static int pseudo_exec(struct child_prog *child)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
execvp(child->argv[0], child->argv);
|
execvp(child->argv[0], child->argv);
|
||||||
perror_msg_and_die("%s", child->argv[0]);
|
|
||||||
|
/* Do not use perror_msg_and_die() here, since we must not
|
||||||
|
* call exit() but should call _exit() instead */
|
||||||
|
fprintf(stderr, "%s: %s\n", child->argv[0], strerror(err));
|
||||||
|
_exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void insert_job(struct job *newjob, int inbg)
|
static void insert_job(struct job *newjob, int inbg)
|
||||||
|
Loading…
Reference in New Issue
Block a user