2022-03-22 01:13:14

by Eric Dumazet

[permalink] [raw]
Subject: [PATCH] watch_queue: Free the page array when watch_queue is dismantled

From: Eric Dumazet <[email protected]>

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 <[email protected]>
Fixes: c73be61cede5 ("pipe: Add general notification queue support")
Signed-off-by: Eric Dumazet <[email protected]>
Cc: David Howells <[email protected]>
Cc: Jann Horn <[email protected]>
---
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


2022-03-27 14:20:20

by Eric Dumazet

[permalink] [raw]
Subject: Re: [PATCH] watch_queue: Free the page array when watch_queue is dismantled

ping ?

On Mon, Mar 21, 2022 at 5:47 PM Eric Dumazet <[email protected]> wrote:
>
> From: Eric Dumazet <[email protected]>
>
> 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 <[email protected]>
> Fixes: c73be61cede5 ("pipe: Add general notification queue support")
> Signed-off-by: Eric Dumazet <[email protected]>
> Cc: David Howells <[email protected]>
> Cc: Jann Horn <[email protected]>
> ---
> 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
>

2022-03-28 21:13:04

by David Howells

[permalink] [raw]
Subject: Re: [PATCH] watch_queue: Free the page array when watch_queue is dismantled

Eric Dumazet <[email protected]> wrote:

> Reported-by: syzbot <[email protected]>

Should this be the following?

Reported-by: [email protected]

David

2022-03-28 22:14:56

by Eric Dumazet

[permalink] [raw]
Subject: Re: [PATCH] watch_queue: Free the page array when watch_queue is dismantled

On Mon, Mar 28, 2022 at 3:34 AM David Howells <[email protected]> wrote:
>
> Eric Dumazet <[email protected]> wrote:
>
> > Reported-by: syzbot <[email protected]>
>
> Should this be the following?
>
> Reported-by: [email protected]
>

This can be.

I mostly send fixes while the syzbot report is not public, so I used a
generic form.
(Because I also take care of feeding the bot with the needed "#syz
fix: patch_title")

In this case, I have released the syzbot report, because I saw you had
a patch for this issue already.

Please add "Reported-by:
[email protected]" when you submit
your fix, thanks !