projects
/
linux.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
15a9dbe
)
nfc: virtual_ncidev: Fix memory leak in virtual_nci_send()
author
Shang XiaoJing
<shangxiaojing@huawei.com>
Thu, 20 Oct 2022 03:05:05 +0000
(11:05 +0800)
committer
Jakub Kicinski
<kuba@kernel.org>
Fri, 21 Oct 2022 04:13:04 +0000
(21:13 -0700)
skb should be free in virtual_nci_send(), otherwise kmemleak will report
memleak.
Steps for reproduction (simulated in qemu):
cd tools/testing/selftests/nci
make
./nci_dev
BUG: memory leak
unreferenced object 0xffff888107588000 (size 208):
comm "nci_dev", pid 206, jiffies
4294945376
(age 368.248s)
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:
[<
000000008d94c8fd
>] __alloc_skb+0x1da/0x290
[<
00000000278bc7f8
>] nci_send_cmd+0xa3/0x350
[<
0000000081256a22
>] nci_reset_req+0x6b/0xa0
[<
000000009e721112
>] __nci_request+0x90/0x250
[<
000000005d556e59
>] nci_dev_up+0x217/0x5b0
[<
00000000e618ce62
>] nfc_dev_up+0x114/0x220
[<
00000000981e226b
>] nfc_genl_dev_up+0x94/0xe0
[<
000000009bb03517
>] genl_family_rcv_msg_doit.isra.14+0x228/0x2d0
[<
00000000b7f8c101
>] genl_rcv_msg+0x35c/0x640
[<
00000000c94075ff
>] netlink_rcv_skb+0x11e/0x350
[<
00000000440cfb1e
>] genl_rcv+0x24/0x40
[<
0000000062593b40
>] netlink_unicast+0x43f/0x640
[<
000000001d0b13cc
>] netlink_sendmsg+0x73a/0xbf0
[<
000000003272487f
>] __sys_sendto+0x324/0x370
[<
00000000ef9f1747
>] __x64_sys_sendto+0xdd/0x1b0
[<
000000001e437841
>] do_syscall_64+0x3f/0x90
Fixes: e624e6c3e777 ("nfc: Add a virtual nci device driver")
Signed-off-by: Shang XiaoJing <shangxiaojing@huawei.com>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Link:
https://lore.kernel.org/r/20221020030505.15572-1-shangxiaojing@huawei.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/nfc/virtual_ncidev.c
patch
|
blob
|
history
diff --git
a/drivers/nfc/virtual_ncidev.c
b/drivers/nfc/virtual_ncidev.c
index f577449e4935083b1848bb0a2fd82e45e7c52358..85c06dbb2c4498008e785ff52df039ab7d1f0c11 100644
(file)
--- a/
drivers/nfc/virtual_ncidev.c
+++ b/
drivers/nfc/virtual_ncidev.c
@@
-54,16
+54,19
@@
static int virtual_nci_send(struct nci_dev *ndev, struct sk_buff *skb)
mutex_lock(&nci_mutex);
if (state != virtual_ncidev_enabled) {
mutex_unlock(&nci_mutex);
+ kfree_skb(skb);
return 0;
}
if (send_buff) {
mutex_unlock(&nci_mutex);
+ kfree_skb(skb);
return -1;
}
send_buff = skb_copy(skb, GFP_KERNEL);
mutex_unlock(&nci_mutex);
wake_up_interruptible(&wq);
+ consume_skb(skb);
return 0;
}