• Mirsad Goran Todorovac's avatar
    test_firmware: fix the memory leak of the allocated firmware buffer · 48e15602
    Mirsad Goran Todorovac authored
    The following kernel memory leak was noticed after running
    tools/testing/selftests/firmware/fw_run_tests.sh:
    
    [root@pc-mtodorov firmware]# cat /sys/kernel/debug/kmemleak
    .
    .
    .
    unreferenced object 0xffff955389bc3400 (size 1024):
      comm "test_firmware-0", pid 5451, jiffies 4294944822 (age 65.652s)
      hex dump (first 32 bytes):
        47 48 34 35 36 37 0a 00 00 00 00 00 00 00 00 00  GH4567..........
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff962f5dec>] slab_post_alloc_hook+0x8c/0x3c0
        [<ffffffff962fcca4>] __kmem_cache_alloc_node+0x184/0x240
        [<ffffffff962704de>] kmalloc_trace+0x2e/0xc0
        [<ffffffff9665b42d>] test_fw_run_batch_request+0x9d/0x180
        [<ffffffff95fd813b>] kthread+0x10b/0x140
        [<ffffffff95e033e9>] ret_from_fork+0x29/0x50
    unreferenced object 0xffff9553c334b400 (size 1024):
      comm "test_firmware-1", pid 5452, jiffies 4294944822 (age 65.652s)
      hex dump (first 32 bytes):
        47 48 34 35 36 37 0a 00 00 00 00 00 00 00 00 00  GH4567..........
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff962f5dec>] slab_post_alloc_hook+0x8c/0x3c0
        [<ffffffff962fcca4>] __kmem_cache_alloc_node+0x184/0x240
        [<ffffffff962704de>] kmalloc_trace+0x2e/0xc0
        [<ffffffff9665b42d>] test_fw_run_batch_request+0x9d/0x180
        [<ffffffff95fd813b>] kthread+0x10b/0x140
        [<ffffffff95e033e9>] ret_from_fork+0x29/0x50
    unreferenced object 0xffff9553c334f000 (size 1024):
      comm "test_firmware-2", pid 5453, jiffies 4294944822 (age 65.652s)
      hex dump (first 32 bytes):
        47 48 34 35 36 37 0a 00 00 00 00 00 00 00 00 00  GH4567..........
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff962f5dec>] slab_post_alloc_hook+0x8c/0x3c0
        [<ffffffff962fcca4>] __kmem_cache_alloc_node+0x184/0x240
        [<ffffffff962704de>] kmalloc_trace+0x2e/0xc0
        [<ffffffff9665b42d>] test_fw_run_batch_request+0x9d/0x180
        [<ffffffff95fd813b>] kthread+0x10b/0x140
        [<ffffffff95e033e9>] ret_from_fork+0x29/0x50
    unreferenced object 0xffff9553c3348400 (size 1024):
      comm "test_firmware-3", pid 5454, jiffies 4294944822 (age 65.652s)
      hex dump (first 32 bytes):
        47 48 34 35 36 37 0a 00 00 00 00 00 00 00 00 00  GH4567..........
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
      backtrace:
        [<ffffffff962f5dec>] slab_post_alloc_hook+0x8c/0x3c0
        [<ffffffff962fcca4>] __kmem_cache_alloc_node+0x184/0x240
        [<ffffffff962704de>] kmalloc_trace+0x2e/0xc0
        [<ffffffff9665b42d>] test_fw_run_batch_request+0x9d/0x180
        [<ffffffff95fd813b>] kthread+0x10b/0x140
        [<ffffffff95e033e9>] ret_from_fork+0x29/0x50
    [root@pc-mtodorov firmware]#
    
    Note that the size 1024 corresponds to the size of the test firmware
    buffer. The actual number of the buffers leaked is around 70-110,
    depending on the test run.
    
    The cause of the leak is the following:
    
    request_partial_firmware_into_buf() and request_firmware_into_buf()
    provided firmware buffer isn't released on release_firmware(), we
    have allocated it and we are responsible for deallocating it manually.
    This is introduced in a number of context where previously only
    release_firmware() was called, which was insufficient.
    Reported-by: default avatarMirsad Goran Todorovac <mirsad.todorovac@alu.unizg.hr>
    Fixes: 7feebfa4 ("test_firmware: add support for request_firmware_into_buf")
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Dan Carpenter <error27@gmail.com>
    Cc: Takashi Iwai <tiwai@suse.de>
    Cc: Luis Chamberlain <mcgrof@kernel.org>
    Cc: Russ Weight <russell.h.weight@intel.com>
    Cc: Tianfei zhang <tianfei.zhang@intel.com>
    Cc: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
    Cc: Zhengchao Shao <shaozhengchao@huawei.com>
    Cc: Colin Ian King <colin.i.king@gmail.com>
    Cc: linux-kernel@vger.kernel.org
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Scott Branden <sbranden@broadcom.com>
    Cc: Luis R. Rodriguez <mcgrof@kernel.org>
    Cc: linux-kselftest@vger.kernel.org
    Cc: stable@vger.kernel.org # v5.4
    Signed-off-by: default avatarMirsad Goran Todorovac <mirsad.todorovac@alu.unizg.hr>
    Link: https://lore.kernel.org/r/20230509084746.48259-3-mirsad.todorovac@alu.unizg.hrSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    48e15602
test_firmware.c 37.4 KB