]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
um: chan_user: Fix winch_tramp() return value
authorJohannes Berg <johannes.berg@intel.com>
Fri, 20 May 2022 17:45:36 +0000 (19:45 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 10 Aug 2022 07:25:23 +0000 (09:25 +0200)
BugLink: https://bugs.launchpad.net/bugs/1981864
commit 57ae0b67b747031bc41fb44643aa5344ab58607e upstream.

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: ccf1236ecac4 ("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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
arch/um/drivers/chan_user.c

index 6040817c036f3fd3ecbc6d6a128b1473d24df22c..25727ed648b7273bf960aa4259aa1374123c493d 100644 (file)
@@ -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]);