um: chan_user: Fix winch_tramp() return value
The previous fix here was only partially correct, it did
result in returning a proper error value in case of error,
but it also clobbered the pid that we need to return from
this function (not just zero for success).
As a result, it returned 0 here, but later this is treated
as a pid and used to kill the process, but since it's now
0 we kill(0, SIGKILL), which makes UML kill itself rather
than just the helper thread.
Fix that and make it more obvious by using a separate
variable for the pid.
Fixes: ccf1236eca
("um: fix error return code in winch_tramp()")
Reported-and-tested-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Cc: stable@vger.kernel.org
Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
Родитель
af9fb41ed3
Коммит
57ae0b67b7
|
@ -220,7 +220,7 @@ static int winch_tramp(int fd, struct tty_port *port, int *fd_out,
|
|||
unsigned long *stack_out)
|
||||
{
|
||||
struct winch_data data;
|
||||
int fds[2], n, err;
|
||||
int fds[2], n, err, pid;
|
||||
char c;
|
||||
|
||||
err = os_pipe(fds, 1, 1);
|
||||
|
@ -238,8 +238,9 @@ static int winch_tramp(int fd, struct tty_port *port, int *fd_out,
|
|||
* problem with /dev/net/tun, which if held open by this
|
||||
* thread, prevents the TUN/TAP device from being reused.
|
||||
*/
|
||||
err = run_helper_thread(winch_thread, &data, CLONE_FILES, stack_out);
|
||||
if (err < 0) {
|
||||
pid = run_helper_thread(winch_thread, &data, CLONE_FILES, stack_out);
|
||||
if (pid < 0) {
|
||||
err = pid;
|
||||
printk(UM_KERN_ERR "fork of winch_thread failed - errno = %d\n",
|
||||
-err);
|
||||
goto out_close;
|
||||
|
@ -263,7 +264,7 @@ static int winch_tramp(int fd, struct tty_port *port, int *fd_out,
|
|||
goto out_close;
|
||||
}
|
||||
|
||||
return err;
|
||||
return pid;
|
||||
|
||||
out_close:
|
||||
close(fds[1]);
|
||||
|
|
Загрузка…
Ссылка в новой задаче