Re: memory leak in sctp_get_port_local

From: Xin Long
Date: Tue Jun 25 2019 - 08:49:22 EST


On Wed, May 29, 2019 at 2:28 AM syzbot
<syzbot+079bf326b38072f849d9@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Hello,
>
> syzbot found the following crash on:
>
> HEAD commit: cd6c84d8 Linux 5.2-rc2
> git tree: upstream
> console output: https://syzkaller.appspot.com/x/log.txt?x=101a184aa00000
> kernel config: https://syzkaller.appspot.com/x/.config?x=64479170dcaf0e11
> dashboard link: https://syzkaller.appspot.com/bug?extid=079bf326b38072f849d9
> compiler: gcc (GCC) 9.0.0 20181231 (experimental)
> syz repro: https://syzkaller.appspot.com/x/repro.syz?x=13b5dbbca00000
> C reproducer: https://syzkaller.appspot.com/x/repro.c?x=1038444aa00000
>
> IMPORTANT: if you fix the bug, please add the following tag to the commit:
> Reported-by: syzbot+079bf326b38072f849d9@xxxxxxxxxxxxxxxxxxxxxxxxx
>
> : Permanently added '10.128.0.127' (ECDSA) to the list of known hosts.
> executing program
> executing program
> BUG: memory leak
> unreferenced object 0xffff8881288ca380 (size 64):
> comm "softirq", pid 0, jiffies 4294944468 (age 13.410s)
> hex dump (first 32 bytes):
> 21 4e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 !N..............
> 28 ae 85 23 81 88 ff ff 00 00 00 00 00 00 00 00 (..#............
> backtrace:
> [<0000000054ece54d>] kmemleak_alloc_recursive
> include/linux/kmemleak.h:55 [inline]
> [<0000000054ece54d>] slab_post_alloc_hook mm/slab.h:439 [inline]
> [<0000000054ece54d>] slab_alloc mm/slab.c:3326 [inline]
> [<0000000054ece54d>] kmem_cache_alloc+0x134/0x270 mm/slab.c:3488
> [<00000000d992ea84>] sctp_bucket_create net/sctp/socket.c:8395 [inline]
> [<00000000d992ea84>] sctp_get_port_local+0x189/0x5b0
> net/sctp/socket.c:8142
> [<0000000099206d90>] sctp_do_bind+0xcc/0x1e0 net/sctp/socket.c:402
> [<00000000b8795757>] sctp_bind+0x44/0x70 net/sctp/socket.c:302
> [<00000000672a44aa>] inet6_bind+0x40/0xb7 net/ipv6/af_inet6.c:445
> [<0000000001400e1c>] __sys_bind+0x11c/0x140 net/socket.c:1659
> [<00000000e69e8036>] __do_sys_bind net/socket.c:1670 [inline]
> [<00000000e69e8036>] __se_sys_bind net/socket.c:1668 [inline]
> [<00000000e69e8036>] __x64_sys_bind+0x1e/0x30 net/socket.c:1668
> [<000000001644bb1f>] do_syscall_64+0x76/0x1a0
> arch/x86/entry/common.c:301
> [<00000000199a1ea2>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
>
will post a fix for this:

@@ -4816,6 +4816,7 @@ static int sctp_setsockopt(struct sock *sk, int
level, int optname,
static int sctp_connect(struct sock *sk, struct sockaddr *addr,
int addr_len, int flags)
{
+ struct sctp_bind_addr *bp = &sctp_sk(sk)->ep->base.bind_addr;
struct inet_sock *inet = inet_sk(sk);
struct sctp_af *af;
int err = 0;
@@ -4826,12 +4827,13 @@ static int sctp_connect(struct sock *sk,
struct sockaddr *addr,
addr, addr_len);

/* We may need to bind the socket. */
- if (!inet->inet_num) {
+ if (!bp->port) {
if (sk->sk_prot->get_port(sk, 0)) {
release_sock(sk);
return -EAGAIN;
}
inet->inet_sport = htons(inet->inet_num);
+ bp->port = inet->inet_sport;
}

>
>
> ---
> This bug is generated by a bot. It may contain errors.
> See https://goo.gl/tpsmEJ for more information about syzbot.
> syzbot engineers can be reached at syzkaller@xxxxxxxxxxxxxxxxx
>
> syzbot will keep track of this bug report. See:
> https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
> syzbot can test patches for this bug, for details see:
> https://goo.gl/tpsmEJ#testing-patches