Re: memory leak in sctp_get_port_local
From: Xin Long <lucien.xin@gmail.com>
Date: 2019-06-25 12:49:22
Also in:
linux-sctp, lkml
On Wed, May 29, 2019 at 2:28 AM syzbot [off-list ref] 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@syzkaller.appspotmail.com : 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, intlevel, 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@googlegroups.com. 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