Re: memory leak in sctp_stream_init_ext (2)

From: Marcelo Ricardo Leitner
Date: Fri Apr 17 2020 - 09:31:18 EST


On Fri, Apr 17, 2020 at 04:32:24PM +0800, Hillf Danton wrote:
>
> On Thu, 16 Apr 2020 20:45:10 -0700
> > syzbot found the following crash on:
> >
> > HEAD commit: 00086336 Merge tag 'efi-urgent-2020-04-15' of git://git.ke..
> > git tree: upstream
> > console output: https://syzkaller.appspot.com/x/log.txt?x=12996107e00000
> > kernel config: https://syzkaller.appspot.com/x/.config?x=efff978b972fb2c
> > dashboard link: https://syzkaller.appspot.com/bug?extid=96e916d6f6f7617bc9fc
> > compiler: gcc (GCC) 9.0.0 20181231 (experimental)
> > syz repro: https://syzkaller.appspot.com/x/repro.syz?x=137ddf3fe00000
> >
> > IMPORTANT: if you fix the bug, please add the following tag to the commit:
> > Reported-by: syzbot+96e916d6f6f7617bc9fc@xxxxxxxxxxxxxxxxxxxxxxxxx
> >
> > BUG: memory leak
> > unreferenced object 0xffff888103ba4580 (size 96):
> > comm "syz-executor.1", pid 8335, jiffies 4294953411 (age 14.410s)
> > 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:
> > [<00000000b06f3e80>] kmalloc include/linux/slab.h:555 [inline]
> > [<00000000b06f3e80>] kzalloc include/linux/slab.h:669 [inline]
> > [<00000000b06f3e80>] sctp_stream_init_ext+0x28/0xe0 net/sctp/stream.c:162
> > [<00000000aff2ecba>] sctp_sendmsg_to_asoc+0x9af/0xab0 net/sctp/socket.c:1811
> > [<00000000d5d5eb76>] sctp_sendmsg+0x2a6/0xc60 net/sctp/socket.c:2031
> > [<0000000023cdbfa3>] inet_sendmsg+0x39/0x60 net/ipv4/af_inet.c:807
> > [<00000000885878ef>] sock_sendmsg_nosec net/socket.c:652 [inline]
> > [<00000000885878ef>] sock_sendmsg+0x4c/0x60 net/socket.c:672
> > [<0000000009d727e5>] __sys_sendto+0x11d/0x1c0 net/socket.c:2000
> > [<0000000066974477>] __do_sys_sendto net/socket.c:2012 [inline]
> > [<0000000066974477>] __se_sys_sendto net/socket.c:2008 [inline]
> > [<0000000066974477>] __x64_sys_sendto+0x26/0x30 net/socket.c:2008
> > [<00000000ecc1fea9>] do_syscall_64+0x6e/0x220 arch/x86/entry/common.c:295
> > [<00000000605d798b>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
>
> Release ext in case of failure of initializing stream.
>
> --- a/net/sctp/stream.c
> +++ b/net/sctp/stream.c
> @@ -145,9 +145,10 @@ in:
> ret = sctp_stream_alloc_in(stream, incnt, gfp);
> if (ret) {

Are you working on the right code? Seems you're missing
61d5d4062876 ("sctp: fix err handling of stream initialization")

Anyhow, the patch intention looks right.

> sched->free(stream);
> + for (i = 0; i < stream->outcnt; i++)
> + kfree(SCTP_SO(stream, i)->ext);
> genradix_free(&stream->out);
> stream->outcnt = 0;
> - goto out;
> }
>
> out:
>