Avoid getting stuck in system(3) when the internal call to wait4()
is interrupted by saving the pid. The old code would assign the return value to pid which would trash it, to fix the problem save a copy of the pid to be used as the paramter to wait4(). Submitted by: Toshihiko ARAI <toshi@jp.FreeBSD.org>
This commit is contained in:
parent
a7e53031f6
commit
9c2ccf2741
@ -53,7 +53,7 @@ int
|
||||
__system(command)
|
||||
const char *command;
|
||||
{
|
||||
pid_t pid;
|
||||
pid_t pid, savedpid;
|
||||
int pstat;
|
||||
struct sigaction ign, intact, quitact;
|
||||
sigset_t newsigblock, oldsigblock;
|
||||
@ -86,8 +86,9 @@ __system(command)
|
||||
execl(_PATH_BSHELL, "sh", "-c", command, (char *)NULL);
|
||||
_exit(127);
|
||||
default: /* parent */
|
||||
savedpid = pid;
|
||||
do {
|
||||
pid = _wait4(pid, &pstat, 0, (struct rusage *)0);
|
||||
pid = _wait4(savedpid, &pstat, 0, (struct rusage *)0);
|
||||
} while (pid == -1 && errno == EINTR);
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user