| From fd79a0cbf0b2e34bcc45b13acf962e2032a82203 Mon Sep 17 00:00:00 2001 |
| From: Tadeusz Struk <tadeusz.struk@linaro.org> |
| Date: Wed, 8 Dec 2021 10:27:42 -0800 |
| Subject: nfc: fix segfault in nfc_genl_dump_devices_done |
| |
| From: Tadeusz Struk <tadeusz.struk@linaro.org> |
| |
| commit fd79a0cbf0b2e34bcc45b13acf962e2032a82203 upstream. |
| |
| When kmalloc in nfc_genl_dump_devices() fails then |
| nfc_genl_dump_devices_done() segfaults as below |
| |
| KASAN: null-ptr-deref in range [0x0000000000000008-0x000000000000000f] |
| CPU: 0 PID: 25 Comm: kworker/0:1 Not tainted 5.16.0-rc4-01180-g2a987e65025e-dirty #5 |
| Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.14.0-6.fc35 04/01/2014 |
| Workqueue: events netlink_sock_destruct_work |
| RIP: 0010:klist_iter_exit+0x26/0x80 |
| Call Trace: |
| <TASK> |
| class_dev_iter_exit+0x15/0x20 |
| nfc_genl_dump_devices_done+0x3b/0x50 |
| genl_lock_done+0x84/0xd0 |
| netlink_sock_destruct+0x8f/0x270 |
| __sk_destruct+0x64/0x3b0 |
| sk_destruct+0xa8/0xd0 |
| __sk_free+0x2e8/0x3d0 |
| sk_free+0x51/0x90 |
| netlink_sock_destruct_work+0x1c/0x20 |
| process_one_work+0x411/0x710 |
| worker_thread+0x6fd/0xa80 |
| |
| Link: https://syzkaller.appspot.com/bug?id=fc0fa5a53db9edd261d56e74325419faf18bd0df |
| Reported-by: syzbot+f9f76f4a0766420b4a02@syzkaller.appspotmail.com |
| Signed-off-by: Tadeusz Struk <tadeusz.struk@linaro.org> |
| Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> |
| Link: https://lore.kernel.org/r/20211208182742.340542-1-tadeusz.struk@linaro.org |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/nfc/netlink.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/net/nfc/netlink.c |
| +++ b/net/nfc/netlink.c |
| @@ -644,8 +644,10 @@ static int nfc_genl_dump_devices_done(st |
| { |
| struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0]; |
| |
| - nfc_device_iter_exit(iter); |
| - kfree(iter); |
| + if (iter) { |
| + nfc_device_iter_exit(iter); |
| + kfree(iter); |
| + } |
| |
| return 0; |
| } |