[PATCH] uml: Fix handling of failed execs of helpers
There were some bugs in handling failures to exec helper programs. errno was passed back from the child with the wrong sign. It was also ignored. In the case where it mattered, the errno from the (successful) read in the parent was used instead. Signed-off-by: Jeff Dike <jdike@addtoit.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
5e1f65a67d
commit
6b7aaad9ba
1 changed files with 11 additions and 11 deletions
|
@ -42,7 +42,7 @@ static int helper_child(void *arg)
|
|||
if(data->pre_exec != NULL)
|
||||
(*data->pre_exec)(data->pre_data);
|
||||
execvp(argv[0], argv);
|
||||
errval = errno;
|
||||
errval = -errno;
|
||||
printk("helper_child - execve of '%s' failed - errno = %d\n", argv[0], errno);
|
||||
os_write_file(data->fd, &errval, sizeof(errval));
|
||||
kill(os_getpid(), SIGKILL);
|
||||
|
@ -62,7 +62,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv,
|
|||
stack = *stack_out;
|
||||
else stack = alloc_stack(0, __cant_sleep());
|
||||
if(stack == 0)
|
||||
return(-ENOMEM);
|
||||
return -ENOMEM;
|
||||
|
||||
ret = os_pipe(fds, 1, 0);
|
||||
if(ret < 0){
|
||||
|
@ -95,16 +95,16 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv,
|
|||
/* Read the errno value from the child, if the exec failed, or get 0 if
|
||||
* the exec succeeded because the pipe fd was set as close-on-exec. */
|
||||
n = os_read_file(fds[0], &ret, sizeof(ret));
|
||||
if (n < 0) {
|
||||
printk("run_helper : read on pipe failed, ret = %d\n", -n);
|
||||
ret = n;
|
||||
kill(pid, SIGKILL);
|
||||
CATCH_EINTR(waitpid(pid, NULL, 0));
|
||||
} else if(n != 0){
|
||||
CATCH_EINTR(n = waitpid(pid, NULL, 0));
|
||||
ret = -errno;
|
||||
} else {
|
||||
if(n == 0)
|
||||
ret = pid;
|
||||
else {
|
||||
if(n < 0){
|
||||
printk("run_helper : read on pipe failed, ret = %d\n",
|
||||
-n);
|
||||
ret = n;
|
||||
kill(pid, SIGKILL);
|
||||
}
|
||||
CATCH_EINTR(waitpid(pid, NULL, 0));
|
||||
}
|
||||
|
||||
out_close:
|
||||
|
|
Reference in a new issue