From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Zqiang <qiang.zhang@windriver.com>,
Kyungtae Kim <kt0755@gmail.com>, Felipe Balbi <balbi@kernel.org>,
Sasha Levin <sashal@kernel.org>,
linux-usb@vger.kernel.org
Subject: [PATCH AUTOSEL 5.4 37/80] usb: gadget: function: printer: fix use-after-free in __lock_acquire
Date: Sun, 18 Oct 2020 15:21:48 -0400 [thread overview]
Message-ID: <20201018192231.4054535-37-sashal@kernel.org> (raw)
In-Reply-To: <20201018192231.4054535-1-sashal@kernel.org>
From: Zqiang <qiang.zhang@windriver.com>
[ Upstream commit e8d5f92b8d30bb4ade76494490c3c065e12411b1 ]
Fix this by increase object reference count.
BUG: KASAN: use-after-free in __lock_acquire+0x3fd4/0x4180
kernel/locking/lockdep.c:3831
Read of size 8 at addr ffff8880683b0018 by task syz-executor.0/3377
CPU: 1 PID: 3377 Comm: syz-executor.0 Not tainted 5.6.11 #1
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
Call Trace:
__dump_stack lib/dump_stack.c:77 [inline]
dump_stack+0xce/0x128 lib/dump_stack.c:118
print_address_description.constprop.4+0x21/0x3c0 mm/kasan/report.c:374
__kasan_report+0x131/0x1b0 mm/kasan/report.c:506
kasan_report+0x12/0x20 mm/kasan/common.c:641
__asan_report_load8_noabort+0x14/0x20 mm/kasan/generic_report.c:135
__lock_acquire+0x3fd4/0x4180 kernel/locking/lockdep.c:3831
lock_acquire+0x127/0x350 kernel/locking/lockdep.c:4488
__raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
_raw_spin_lock_irqsave+0x35/0x50 kernel/locking/spinlock.c:159
printer_ioctl+0x4a/0x110 drivers/usb/gadget/function/f_printer.c:723
vfs_ioctl fs/ioctl.c:47 [inline]
ksys_ioctl+0xfb/0x130 fs/ioctl.c:763
__do_sys_ioctl fs/ioctl.c:772 [inline]
__se_sys_ioctl fs/ioctl.c:770 [inline]
__x64_sys_ioctl+0x73/0xb0 fs/ioctl.c:770
do_syscall_64+0x9e/0x510 arch/x86/entry/common.c:294
entry_SYSCALL_64_after_hwframe+0x49/0xbe
RIP: 0033:0x4531a9
Code: ed 60 fc ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 89 f8 48
89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d
01 f0 ff ff 0f 83 bb 60 fc ff c3 66 2e 0f 1f 84 00 00 00 00
RSP: 002b:00007fd14ad72c78 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
RAX: ffffffffffffffda RBX: 000000000073bfa8 RCX: 00000000004531a9
RDX: fffffffffffffff9 RSI: 000000000000009e RDI: 0000000000000003
RBP: 0000000000000003 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 00000000004bbd61
R13: 00000000004d0a98 R14: 00007fd14ad736d4 R15: 00000000ffffffff
Allocated by task 2393:
save_stack+0x21/0x90 mm/kasan/common.c:72
set_track mm/kasan/common.c:80 [inline]
__kasan_kmalloc.constprop.3+0xa7/0xd0 mm/kasan/common.c:515
kasan_kmalloc+0x9/0x10 mm/kasan/common.c:529
kmem_cache_alloc_trace+0xfa/0x2d0 mm/slub.c:2813
kmalloc include/linux/slab.h:555 [inline]
kzalloc include/linux/slab.h:669 [inline]
gprinter_alloc+0xa1/0x870 drivers/usb/gadget/function/f_printer.c:1416
usb_get_function+0x58/0xc0 drivers/usb/gadget/functions.c:61
config_usb_cfg_link+0x1ed/0x3e0 drivers/usb/gadget/configfs.c:444
configfs_symlink+0x527/0x11d0 fs/configfs/symlink.c:202
vfs_symlink+0x33d/0x5b0 fs/namei.c:4201
do_symlinkat+0x11b/0x1d0 fs/namei.c:4228
__do_sys_symlinkat fs/namei.c:4242 [inline]
__se_sys_symlinkat fs/namei.c:4239 [inline]
__x64_sys_symlinkat+0x73/0xb0 fs/namei.c:4239
do_syscall_64+0x9e/0x510 arch/x86/entry/common.c:294
entry_SYSCALL_64_after_hwframe+0x49/0xbe
Freed by task 3368:
save_stack+0x21/0x90 mm/kasan/common.c:72
set_track mm/kasan/common.c:80 [inline]
kasan_set_free_info mm/kasan/common.c:337 [inline]
__kasan_slab_free+0x135/0x190 mm/kasan/common.c:476
kasan_slab_free+0xe/0x10 mm/kasan/common.c:485
slab_free_hook mm/slub.c:1444 [inline]
slab_free_freelist_hook mm/slub.c:1477 [inline]
slab_free mm/slub.c:3034 [inline]
kfree+0xf7/0x410 mm/slub.c:3995
gprinter_free+0x49/0xd0 drivers/usb/gadget/function/f_printer.c:1353
usb_put_function+0x38/0x50 drivers/usb/gadget/functions.c:87
config_usb_cfg_unlink+0x2db/0x3b0 drivers/usb/gadget/configfs.c:485
configfs_unlink+0x3b9/0x7f0 fs/configfs/symlink.c:250
vfs_unlink+0x287/0x570 fs/namei.c:4073
do_unlinkat+0x4f9/0x620 fs/namei.c:4137
__do_sys_unlink fs/namei.c:4184 [inline]
__se_sys_unlink fs/namei.c:4182 [inline]
__x64_sys_unlink+0x42/0x50 fs/namei.c:4182
do_syscall_64+0x9e/0x510 arch/x86/entry/common.c:294
entry_SYSCALL_64_after_hwframe+0x49/0xbe
The buggy address belongs to the object at ffff8880683b0000
which belongs to the cache kmalloc-1k of size 1024
The buggy address is located 24 bytes inside of
1024-byte region [ffff8880683b0000, ffff8880683b0400)
The buggy address belongs to the page:
page:ffffea0001a0ec00 refcount:1 mapcount:0 mapping:ffff88806c00e300
index:0xffff8880683b1800 compound_mapcount: 0
flags: 0x100000000010200(slab|head)
raw: 0100000000010200 0000000000000000 0000000600000001 ffff88806c00e300
raw: ffff8880683b1800 000000008010000a 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
Reported-by: Kyungtae Kim <kt0755@gmail.com>
Signed-off-by: Zqiang <qiang.zhang@windriver.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/usb/gadget/function/f_printer.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c
index 9c7ed2539ff77..8ed1295d7e350 100644
--- a/drivers/usb/gadget/function/f_printer.c
+++ b/drivers/usb/gadget/function/f_printer.c
@@ -31,6 +31,7 @@
#include <linux/types.h>
#include <linux/ctype.h>
#include <linux/cdev.h>
+#include <linux/kref.h>
#include <asm/byteorder.h>
#include <linux/io.h>
@@ -64,7 +65,7 @@ struct printer_dev {
struct usb_gadget *gadget;
s8 interface;
struct usb_ep *in_ep, *out_ep;
-
+ struct kref kref;
struct list_head rx_reqs; /* List of free RX structs */
struct list_head rx_reqs_active; /* List of Active RX xfers */
struct list_head rx_buffers; /* List of completed xfers */
@@ -218,6 +219,13 @@ static inline struct usb_endpoint_descriptor *ep_desc(struct usb_gadget *gadget,
/*-------------------------------------------------------------------------*/
+static void printer_dev_free(struct kref *kref)
+{
+ struct printer_dev *dev = container_of(kref, struct printer_dev, kref);
+
+ kfree(dev);
+}
+
static struct usb_request *
printer_req_alloc(struct usb_ep *ep, unsigned len, gfp_t gfp_flags)
{
@@ -348,6 +356,7 @@ printer_open(struct inode *inode, struct file *fd)
spin_unlock_irqrestore(&dev->lock, flags);
+ kref_get(&dev->kref);
DBG(dev, "printer_open returned %x\n", ret);
return ret;
}
@@ -365,6 +374,7 @@ printer_close(struct inode *inode, struct file *fd)
dev->printer_status &= ~PRINTER_SELECTED;
spin_unlock_irqrestore(&dev->lock, flags);
+ kref_put(&dev->kref, printer_dev_free);
DBG(dev, "printer_close\n");
return 0;
@@ -1350,7 +1360,8 @@ static void gprinter_free(struct usb_function *f)
struct f_printer_opts *opts;
opts = container_of(f->fi, struct f_printer_opts, func_inst);
- kfree(dev);
+
+ kref_put(&dev->kref, printer_dev_free);
mutex_lock(&opts->lock);
--opts->refcnt;
mutex_unlock(&opts->lock);
@@ -1419,6 +1430,7 @@ static struct usb_function *gprinter_alloc(struct usb_function_instance *fi)
return ERR_PTR(-ENOMEM);
}
+ kref_init(&dev->kref);
++opts->refcnt;
dev->minor = opts->minor;
dev->pnp_string = opts->pnp_string;
--
2.25.1
next prev parent reply other threads:[~2020-10-18 19:44 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-18 19:21 [PATCH AUTOSEL 5.4 01/80] md/bitmap: fix memory leak of temporary bitmap Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 02/80] block: ratelimit handle_bad_sector() message Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 03/80] crypto: ccp - fix error handling Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 04/80] x86/asm: Replace __force_order with a memory clobber Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 05/80] x86/mce: Add Skylake quirk for patrol scrub reported errors Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 06/80] media: firewire: fix memory leak Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 07/80] media: ati_remote: sanity check for both endpoints Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 08/80] media: st-delta: Fix reference count leak in delta_run_work Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 09/80] media: sti: Fix reference count leaks Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 10/80] media: exynos4-is: Fix several reference count leaks due to pm_runtime_get_sync Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 11/80] media: exynos4-is: Fix a reference count leak " Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 12/80] media: exynos4-is: Fix a reference count leak Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 13/80] media: vsp1: Fix runtime PM imbalance on error Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 14/80] media: platform: s3c-camif: " Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 15/80] media: platform: sti: hva: " Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 16/80] media: bdisp: " Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 17/80] media: media/pci: prevent memory leak in bttv_probe Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 18/80] x86/mce: Make mce_rdmsrl() panic on an inaccessible MSR Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 19/80] media: rcar_drif: Fix fwnode reference leak when parsing DT Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 20/80] media: uvcvideo: Ensure all probed info is returned to v4l2 Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 21/80] seccomp: kill process instead of thread for unknown actions Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 22/80] mmc: sdio: Check for CISTPL_VERS_1 buffer size Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 23/80] media: saa7134: avoid a shift overflow Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 24/80] media: venus: fixes for list corruption Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 25/80] fs: dlm: fix configfs memory leak Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 26/80] media: venus: core: Fix runtime PM imbalance in venus_probe Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 27/80] ipv6/icmp: l3mdev: Perform icmp error route lookup on source device routing table (v2) Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 28/80] ntfs: add check for mft record size in superblock Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 29/80] ip_gre: set dev->hard_header_len and dev->needed_headroom properly Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 30/80] mac80211: handle lack of sband->bitrates in rates Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 31/80] PM: hibernate: remove the bogus call to get_gendisk() in software_resume() Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 32/80] scsi: mvumi: Fix error return in mvumi_io_attach() Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 33/80] scsi: target: core: Add CONTROL field for trace events Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 34/80] mic: vop: copy data to kernel space then write to io memory Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 35/80] misc: vop: add round_up(x,4) for vring_size to avoid kernel panic Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 36/80] usb: dwc3: Add splitdisable quirk for Hisilicon Kirin Soc Sasha Levin
2020-10-18 19:21 ` Sasha Levin [this message]
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 38/80] udf: Limit sparing table size Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 39/80] udf: Avoid accessing uninitialized data on failed inode read Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 40/80] rtw88: increse the size of rx buffer size Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 41/80] USB: cdc-acm: handle broken union descriptors Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 42/80] usb: dwc3: simple: add support for Hikey 970 Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 43/80] can: flexcan: flexcan_chip_stop(): add error handling and propagate error value Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 44/80] ath9k: hif_usb: fix race condition between usb_get_urb() and usb_kill_anchored_urbs() Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 45/80] drm/panfrost: add amlogic reset quirk callback Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 46/80] bpf: Limit caller's stack depth 256 for subprogs with tailcalls Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 47/80] misc: rtsx: Fix memory leak in rtsx_pci_probe Sasha Levin
2020-10-18 19:21 ` [PATCH AUTOSEL 5.4 48/80] reiserfs: only call unlock_new_inode() if I_NEW Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 49/80] opp: Prevent memory leak in dev_pm_opp_attach_genpd() Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 50/80] xfs: make sure the rt allocator doesn't run off the end Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 51/80] usb: ohci: Default to per-port over-current protection Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 52/80] Bluetooth: Only mark socket zapped after unlocking Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 53/80] drm/msm/a6xx: fix a potential overflow issue Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 54/80] iomap: fix WARN_ON_ONCE() from unprivileged users Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 55/80] scsi: ibmvfc: Fix error return in ibmvfc_probe() Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 56/80] scsi: qla2xxx: Warn if done() or free() are called on an already freed srb Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 57/80] selftests/bpf: Fix test_sysctl_loop{1, 2} failure due to clang change Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 58/80] brcmsmac: fix memory leak in wlc_phy_attach_lcnphy Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 59/80] rtl8xxxu: prevent potential memory leak Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 60/80] Fix use after free in get_capset_info callback Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 61/80] HID: ite: Add USB id match for Acer One S1003 keyboard dock Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 62/80] scsi: qedf: Return SUCCESS if stale rport is encountered Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 63/80] scsi: qedi: Protect active command list to avoid list corruption Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 64/80] scsi: qedi: Fix list_del corruption while removing active I/O Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 65/80] fbmem: add margin check to fb_check_caps() Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 66/80] tty: ipwireless: fix error handling Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 67/80] drm/amd/display: Fix a list corruption Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 68/80] Bluetooth: btusb: Fix memleak in btusb_mtk_submit_wmt_recv_urb Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 69/80] ipvs: Fix uninit-value in do_ip_vs_set_ctl() Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 70/80] reiserfs: Fix memory leak in reiserfs_parse_options() Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 71/80] mwifiex: don't call del_timer_sync() on uninitialized timer Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 72/80] ALSA: hda/ca0132 - Add AE-7 microphone selection commands Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 73/80] ALSA: hda/ca0132 - Add new quirk ID for SoundBlaster AE-7 Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 74/80] scsi: smartpqi: Avoid crashing kernel for controller issues Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 75/80] brcm80211: fix possible memleak in brcmf_proto_msgbuf_attach Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 76/80] usb: core: Solve race condition in anchor cleanup functions Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 77/80] scsi: ufs: ufs-qcom: Fix race conditions caused by ufs_qcom_testbus_config() Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 78/80] dmaengine: dw: Add DMA-channels mask cell support Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 79/80] dmaengine: dw: Activate FIFO-mode for memory peripherals only Sasha Levin
2020-10-18 19:22 ` [PATCH AUTOSEL 5.4 80/80] ath10k: check idx validity in __ath10k_htt_rx_ring_fill_n() Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201018192231.4054535-37-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=balbi@kernel.org \
--cc=kt0755@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=qiang.zhang@windriver.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox