lkml.org 
[lkml]   [2022]   [Apr]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 227/475] mxser: fix xmit_buf leak in activate when LSR == 0xff
    Date
    From: Jiri Slaby <jslaby@suse.cz>

    [ 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 | 15 +++++++++++----
    1 file changed, 11 insertions(+), 4 deletions(-)

    diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c
    index 9d00ff5ef961..085dc8dd1327 100644
    --- a/drivers/tty/mxser.c
    +++ b/drivers/tty/mxser.c
    @@ -861,6 +861,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)
    @@ -870,9 +871,9 @@ static int mxser_activate(struct tty_port *port, struct tty_struct *tty)

    if (!info->ioaddr || !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;

    @@ -898,8 +899,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;
    }

    /*
    @@ -944,6 +947,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;
    }

    /*
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-04-14 17:10    [W:4.018 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site