Patch "floppy: Fix memory leak in do_floppy_init()" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    floppy: Fix memory leak in do_floppy_init()

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     floppy-fix-memory-leak-in-do_floppy_init.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.


>From f8ace2e304c5dd8a7328db9cd2b8a4b1b98d83ec Mon Sep 17 00:00:00 2001
From: Yuan Can <yuancan@xxxxxxxxxx>
Date: Mon, 31 Oct 2022 12:04:43 +0000
Subject: floppy: Fix memory leak in do_floppy_init()

From: Yuan Can <yuancan@xxxxxxxxxx>

commit f8ace2e304c5dd8a7328db9cd2b8a4b1b98d83ec upstream.

A memory leak was reported when floppy_alloc_disk() failed in
do_floppy_init().

unreferenced object 0xffff888115ed25a0 (size 8):
  comm "modprobe", pid 727, jiffies 4295051278 (age 25.529s)
  hex dump (first 8 bytes):
    00 ac 67 5b 81 88 ff ff                          ..g[....
  backtrace:
    [<000000007f457abb>] __kmalloc_node+0x4c/0xc0
    [<00000000a87bfa9e>] blk_mq_realloc_tag_set_tags.part.0+0x6f/0x180
    [<000000006f02e8b1>] blk_mq_alloc_tag_set+0x573/0x1130
    [<0000000066007fd7>] 0xffffffffc06b8b08
    [<0000000081f5ac40>] do_one_initcall+0xd0/0x4f0
    [<00000000e26d04ee>] do_init_module+0x1a4/0x680
    [<000000001bb22407>] load_module+0x6249/0x7110
    [<00000000ad31ac4d>] __do_sys_finit_module+0x140/0x200
    [<000000007bddca46>] do_syscall_64+0x35/0x80
    [<00000000b5afec39>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
unreferenced object 0xffff88810fc30540 (size 32):
  comm "modprobe", pid 727, jiffies 4295051278 (age 25.529s)
  hex dump (first 32 bytes):
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  backtrace:
    [<000000007f457abb>] __kmalloc_node+0x4c/0xc0
    [<000000006b91eab4>] blk_mq_alloc_tag_set+0x393/0x1130
    [<0000000066007fd7>] 0xffffffffc06b8b08
    [<0000000081f5ac40>] do_one_initcall+0xd0/0x4f0
    [<00000000e26d04ee>] do_init_module+0x1a4/0x680
    [<000000001bb22407>] load_module+0x6249/0x7110
    [<00000000ad31ac4d>] __do_sys_finit_module+0x140/0x200
    [<000000007bddca46>] do_syscall_64+0x35/0x80
    [<00000000b5afec39>] entry_SYSCALL_64_after_hwframe+0x46/0xb0

If the floppy_alloc_disk() failed, disks of current drive will not be set,
thus the lastest allocated set->tag cannot be freed in the error handling
path. A simple call graph shown as below:

 floppy_module_init()
   floppy_init()
     do_floppy_init()
       for (drive = 0; drive < N_DRIVE; drive++)
         blk_mq_alloc_tag_set()
           blk_mq_alloc_tag_set_tags()
             blk_mq_realloc_tag_set_tags() # set->tag allocated
         floppy_alloc_disk()
           blk_mq_alloc_disk() # error occurred, disks failed to allocated

       ->out_put_disk:
       for (drive = 0; drive < N_DRIVE; drive++)
         if (!disks[drive][0]) # the last disks is not set and loop break
           break;
         blk_mq_free_tag_set() # the latest allocated set->tag leaked

Fix this problem by free the set->tag of current drive before jump to
error handling path.

Cc: stable@xxxxxxxxxxxxxxx
Fixes: 302cfee15029 ("floppy: use a separate gendisk for each media format")
Signed-off-by: Yuan Can <yuancan@xxxxxxxxxx>
[efremov: added stable list, changed title]
Signed-off-by: Denis Efremov <efremov@xxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
 drivers/block/floppy.c |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -4587,8 +4587,10 @@ static int __init do_floppy_init(void)
 			goto out_put_disk;
 
 		err = floppy_alloc_disk(drive, 0);
-		if (err)
+		if (err) {
+			blk_mq_free_tag_set(&tag_sets[drive]);
 			goto out_put_disk;
+		}
 
 		timer_setup(&motor_off_timer[drive], motor_off_callback, 0);
 	}


Patches currently in stable-queue which might be from yuancan@xxxxxxxxxx are

queue-5.15/asoc-qcom-add-checks-for-devm_kcalloc.patch
queue-5.15/drivers-net-qlcnic-fix-potential-memory-leak-in-qlcn.patch
queue-5.15/power-supply-ab8500-fix-error-handling-in-ab8500_cha.patch
queue-5.15/floppy-fix-memory-leak-in-do_floppy_init.patch
queue-5.15/regulator-qcom-labibb-fix-missing-of_node_put-in-qco.patch
queue-5.15/serial-sunsab-fix-error-handling-in-sunsab_init.patch
queue-5.15/iommu-fsl_pamu-fix-resource-leak-in-fsl_pamu_probe.patch
queue-5.15/platform-chrome-cros_usbpd_notify-fix-error-handling.patch
queue-5.15/media-platform-exynos4-is-fix-error-handling-in-fimc.patch
queue-5.15/remoteproc-qcom_q6v5_pas-fix-missing-of_node_put-in-.patch
queue-5.15/hsi-omap_ssi_core-fix-error-handling-in-ssi_init.patch
queue-5.15/tpm-tpm_ftpm_tee-fix-error-handling-in-ftpm_mod_init.patch
queue-5.15/rdma-nldev-add-checks-for-nla_nest_start-in-fill_sta.patch
queue-5.15/perf-arm_dsu-fix-hotplug-callback-leak-in-dsu_pmu_in.patch
queue-5.15/serial-8250_bcm7271-fix-error-handling-in-brcmuart_i.patch
queue-5.15/scsi-hpsa-fix-possible-memory-leak-in-hpsa_init_one.patch



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux