Messages in this thread Patch in this message | | | From | Eric Dumazet <> | Subject | [PATCH] watch_queue: Free the page array when watch_queue is dismantled | Date | Mon, 21 Mar 2022 17:46:54 -0700 |
| |
From: Eric Dumazet <edumazet@google.com>
Commit 7ea1a0124b6d ("watch_queue: Free the alloc bitmap when the watch_queue is torn down") took care of the bitmap, but not the page array.
BUG: memory leak unreferenced object 0xffff88810d9bc140 (size 32): comm "syz-executor335", pid 3603, jiffies 4294946994 (age 12.840s) hex dump (first 32 bytes): 40 a7 40 04 00 ea ff ff 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: [<ffffffff81459bff>] kmalloc_array include/linux/slab.h:621 [inline] [<ffffffff81459bff>] kcalloc include/linux/slab.h:652 [inline] [<ffffffff81459bff>] watch_queue_set_size+0x12f/0x2e0 kernel/watch_queue.c:251 [<ffffffff8159fcf2>] pipe_ioctl+0x82/0x140 fs/pipe.c:632 [<ffffffff815b601c>] vfs_ioctl fs/ioctl.c:51 [inline] [<ffffffff815b601c>] __do_sys_ioctl fs/ioctl.c:874 [inline] [<ffffffff815b601c>] __se_sys_ioctl fs/ioctl.c:860 [inline] [<ffffffff815b601c>] __x64_sys_ioctl+0xfc/0x140 fs/ioctl.c:860 [<ffffffff84493a05>] do_syscall_x64 arch/x86/entry/common.c:50 [inline] [<ffffffff84493a05>] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80 [<ffffffff84600068>] entry_SYSCALL_64_after_hwframe+0x44/0xae
Reported-by: syzbot <syzkaller@googlegroups.com> Fixes: c73be61cede5 ("pipe: Add general notification queue support") Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: David Howells <dhowells@redhat.com> Cc: Jann Horn <jannh@google.com> --- kernel/watch_queue.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/kernel/watch_queue.c b/kernel/watch_queue.c index 00703444a21948deaa8b7ac8b57b73528badff0d..58fe68664eb1b0001cb00c8d046e108462df4836 100644 --- a/kernel/watch_queue.c +++ b/kernel/watch_queue.c @@ -370,6 +370,7 @@ static void __put_watch_queue(struct kref *kref) for (i = 0; i < wqueue->nr_pages; i++) __free_page(wqueue->notes[i]); + kfree(wqueue->notes); bitmap_free(wqueue->notes_bitmap); wfilter = rcu_access_pointer(wqueue->filter); -- 2.35.1.894.gb6a874cedc-goog
| |