lkml.org 
[lkml]   [2020]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 079/149] console: newport_con: fix an issue about leak related system resources
    Date
    From: Dejin Zheng <zhengdejin5@gmail.com>

    [ Upstream commit fd4b8243877250c05bb24af7fea5567110c9720b ]

    A call of the function do_take_over_console() can fail here.
    The corresponding system resources were not released then.
    Thus add a call of iounmap() and release_mem_region()
    together with the check of a failure predicate. and also
    add release_mem_region() on device removal.

    Fixes: e86bb8acc0fdc ("[PATCH] VT binding: Make newport_con support binding")
    Suggested-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    Signed-off-by: Dejin Zheng <zhengdejin5@gmail.com>
    Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Andrew Morton <akpm@osdl.org>
    Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20200423164251.3349-1-zhengdejin5@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/video/console/newport_con.c | 12 ++++++++++--
    1 file changed, 10 insertions(+), 2 deletions(-)

    diff --git a/drivers/video/console/newport_con.c b/drivers/video/console/newport_con.c
    index bb4e96255974a..bd0c6e53bec19 100644
    --- a/drivers/video/console/newport_con.c
    +++ b/drivers/video/console/newport_con.c
    @@ -31,6 +31,8 @@
    #include <linux/linux_logo.h>
    #include <linux/font.h>

    +#define NEWPORT_LEN 0x10000
    +
    #define FONT_DATA ((unsigned char *)font_vga_8x16.data)

    /* borrowed from fbcon.c */
    @@ -42,6 +44,7 @@
    static unsigned char *font_data[MAX_NR_CONSOLES];

    static struct newport_regs *npregs;
    +static unsigned long newport_addr;

    static int logo_active;
    static int topscan;
    @@ -743,7 +746,6 @@ const struct consw newport_con = {
    static int newport_probe(struct gio_device *dev,
    const struct gio_device_id *id)
    {
    - unsigned long newport_addr;
    int err;

    if (!dev->resource.start)
    @@ -753,7 +755,7 @@ static int newport_probe(struct gio_device *dev,
    return -EBUSY; /* we only support one Newport as console */

    newport_addr = dev->resource.start + 0xF0000;
    - if (!request_mem_region(newport_addr, 0x10000, "Newport"))
    + if (!request_mem_region(newport_addr, NEWPORT_LEN, "Newport"))
    return -ENODEV;

    npregs = (struct newport_regs *)/* ioremap cannot fail */
    @@ -761,6 +763,11 @@ static int newport_probe(struct gio_device *dev,
    console_lock();
    err = do_take_over_console(&newport_con, 0, MAX_NR_CONSOLES - 1, 1);
    console_unlock();
    +
    + if (err) {
    + iounmap((void *)npregs);
    + release_mem_region(newport_addr, NEWPORT_LEN);
    + }
    return err;
    }

    @@ -768,6 +775,7 @@ static void newport_remove(struct gio_device *dev)
    {
    give_up_console(&newport_con);
    iounmap((void *)npregs);
    + release_mem_region(newport_addr, NEWPORT_LEN);
    }

    static struct gio_device_id newport_ids[] = {
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-08-20 12:32    [W:3.757 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site