]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mxser: fix xmit_buf leak in activate when LSR == 0xff
authorJiri Slaby <jslaby@suse.cz>
Mon, 24 Jan 2022 07:14:24 +0000 (08:14 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Apr 2022 12:06:21 +0000 (14:06 +0200)
[ Upstream commit cd3a4907ee334b40d7aa880c7ab310b154fd5cd4 ]

When LSR is 0xff in ->activate() (rather unlike), we return an error.
Provided ->shutdown() is not called when ->activate() fails, nothing
actually frees the buffer in this case.

Fix this by properly freeing the buffer in a designated label. We jump
there also from the "!info->type" if now too.

Fixes: 6769140d3047 ("tty: mxser: use the tty_port_open method")
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20220124071430.14907-6-jslaby@suse.cz
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/tty/mxser.c

index 39458b42df7b071fbcdfa6d4a7402f279ed36815..88d2f16fbf89a95f63fa383996c3f7fb02793f1a 100644 (file)
@@ -719,6 +719,7 @@ static int mxser_activate(struct tty_port *port, struct tty_struct *tty)
        struct mxser_port *info = container_of(port, struct mxser_port, port);
        unsigned long page;
        unsigned long flags;
+       int ret;
 
        page = __get_free_page(GFP_KERNEL);
        if (!page)
@@ -728,9 +729,9 @@ static int mxser_activate(struct tty_port *port, struct tty_struct *tty)
 
        if (!info->type) {
                set_bit(TTY_IO_ERROR, &tty->flags);
-               free_page(page);
                spin_unlock_irqrestore(&info->slock, flags);
-               return 0;
+               ret = 0;
+               goto err_free_xmit;
        }
        info->port.xmit_buf = (unsigned char *) page;
 
@@ -750,8 +751,10 @@ static int mxser_activate(struct tty_port *port, struct tty_struct *tty)
                if (capable(CAP_SYS_ADMIN)) {
                        set_bit(TTY_IO_ERROR, &tty->flags);
                        return 0;
-               } else
-                       return -ENODEV;
+               }
+
+               ret = -ENODEV;
+               goto err_free_xmit;
        }
 
        /*
@@ -796,6 +799,10 @@ static int mxser_activate(struct tty_port *port, struct tty_struct *tty)
        spin_unlock_irqrestore(&info->slock, flags);
 
        return 0;
+err_free_xmit:
+       free_page(page);
+       info->port.xmit_buf = NULL;
+       return ret;
 }
 
 /*