From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755113AbbL3Umw (ORCPT ); Wed, 30 Dec 2015 15:42:52 -0500 Received: from mail-wm0-f54.google.com ([74.125.82.54]:36448 "EHLO mail-wm0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754433AbbL3Ums convert rfc822-to-8bit (ORCPT ); Wed, 30 Dec 2015 15:42:48 -0500 MIME-Version: 1.0 From: Dmitry Vyukov Date: Wed, 30 Dec 2015 21:42:27 +0100 Message-ID: Subject: net/sctp: sock memory leak To: Vlad Yasevich , Neil Horman , "David S. Miller" , linux-sctp@vger.kernel.org, netdev , LKML Cc: syzkaller , Kostya Serebryany , Alexander Potapenko , Sasha Levin , Eric Dumazet Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello, The following program leads to a leak of two sock objects: // autogenerated by syzkaller (http://github.com/google/syzkaller) #include #include #include #include #include int fd; void *thr(void *arg) { memcpy((void*)0x2000bbbe, "\x0a\x00\x33\xdc\x14\x4d\x5b\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xdd\x01\xf8\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 128); syscall(SYS_sendto, fd, 0x2000b000ul, 0x70ul, 0x8000ul, 0x2000bbbeul, 0x80ul); return 0; } int main() { long i; pthread_t th[6]; syscall(SYS_mmap, 0x20000000ul, 0x20000ul, 0x3ul, 0x32ul, 0xfffffffffffffffful, 0x0ul); fd = syscall(SYS_socket, 0xaul, 0x1ul, 0x84ul, 0, 0, 0); memcpy((void*)0x20003000, "\x02\x00\x33\xdf\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 128); syscall(SYS_bind, fd, 0x20003000ul, 0x80ul, 0, 0, 0); pthread_create(&th[0], 0, thr, (void*)0); usleep(100000); syscall(SYS_listen, fd, 0x3ul, 0, 0, 0, 0); syscall(SYS_accept, fd, 0x20005f80ul, 0x20003000ul, 0, 0, 0); return 0; } unreferenced object 0xffff8800342540c0 (size 1864): comm "a.out", pid 24109, jiffies 4299060398 (age 27.984s) hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0a 00 07 40 00 00 00 00 00 00 00 00 00 00 00 00 ...@............ backtrace: [] kmemleak_alloc+0x72/0xc0 mm/kmemleak.c:915 [< inline >] kmemleak_alloc_recursive include/linux/kmemleak.h:47 [< inline >] slab_post_alloc_hook mm/slub.c:1335 [< inline >] slab_alloc_node mm/slub.c:2594 [< inline >] slab_alloc mm/slub.c:2602 [] kmem_cache_alloc+0x12d/0x2c0 mm/slub.c:2607 [] sk_prot_alloc+0x69/0x340 net/core/sock.c:1344 [] sk_alloc+0x3a/0x6b0 net/core/sock.c:1419 [] inet6_create+0x2d7/0x1000 net/ipv6/af_inet6.c:173 [] __sock_create+0x37c/0x640 net/socket.c:1162 [< inline >] sock_create net/socket.c:1202 [< inline >] SYSC_socket net/socket.c:1232 [] SyS_socket+0xef/0x1b0 net/socket.c:1212 [] entry_SYSCALL_64_fastpath+0x16/0x7a arch/x86/entry/entry_64.S:185 [] 0xffffffffffffffff unreferenced object 0xffff880034253780 (size 1864): comm "a.out", pid 24109, jiffies 4299060500 (age 27.882s) hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 00 00 00 00 33 dc 00 00 ............3... 0a 00 07 40 00 00 00 00 d8 40 25 34 00 88 ff ff ...@.....@%4.... backtrace: [] kmemleak_alloc+0x72/0xc0 mm/kmemleak.c:915 [< inline >] kmemleak_alloc_recursive include/linux/kmemleak.h:47 [< inline >] slab_post_alloc_hook mm/slub.c:1335 [< inline >] slab_alloc_node mm/slub.c:2594 [< inline >] slab_alloc mm/slub.c:2602 [] kmem_cache_alloc+0x12d/0x2c0 mm/slub.c:2607 [] sk_prot_alloc+0x69/0x340 net/core/sock.c:1344 [] sk_alloc+0x3a/0x6b0 net/core/sock.c:1419 [] sctp_v6_create_accept_sk+0xf0/0x790 net/sctp/ipv6.c:646 [] sctp_accept+0x409/0x6d0 net/sctp/socket.c:3925 [] inet_accept+0xe3/0x660 net/ipv4/af_inet.c:671 [] SYSC_accept4+0x32c/0x630 net/socket.c:1474 [< inline >] SyS_accept4 net/socket.c:1424 [< inline >] SYSC_accept net/socket.c:1508 [] SyS_accept+0x26/0x30 net/socket.c:1505 [] entry_SYSCALL_64_fastpath+0x16/0x7a arch/x86/entry/entry_64.S:185 [] 0xffffffffffffffff On commit 8513342170278468bac126640a5d2d12ffbff106 (Dec 28). From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dmitry Vyukov Date: Wed, 30 Dec 2015 20:42:27 +0000 Subject: net/sctp: sock memory leak Message-Id: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Vlad Yasevich , Neil Horman , "David S. Miller" , linux-sctp@vger.kernel.org, netdev , LKML Cc: syzkaller , Kostya Serebryany , Alexander Potapenko , Sasha Levin , Eric Dumazet Hello, The following program leads to a leak of two sock objects: // autogenerated by syzkaller (http://github.com/google/syzkaller) #include #include #include #include #include int fd; void *thr(void *arg) { memcpy((void*)0x2000bbbe, "\x0a\x00\x33\xdc\x14\x4d\x5b\xd1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xdd\x01\xf8\xfd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 128); syscall(SYS_sendto, fd, 0x2000b000ul, 0x70ul, 0x8000ul, 0x2000bbbeul, 0x80ul); return 0; } int main() { long i; pthread_t th[6]; syscall(SYS_mmap, 0x20000000ul, 0x20000ul, 0x3ul, 0x32ul, 0xfffffffffffffffful, 0x0ul); fd = syscall(SYS_socket, 0xaul, 0x1ul, 0x84ul, 0, 0, 0); memcpy((void*)0x20003000, "\x02\x00\x33\xdf\x7f\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 128); syscall(SYS_bind, fd, 0x20003000ul, 0x80ul, 0, 0, 0); pthread_create(&th[0], 0, thr, (void*)0); usleep(100000); syscall(SYS_listen, fd, 0x3ul, 0, 0, 0, 0); syscall(SYS_accept, fd, 0x20005f80ul, 0x20003000ul, 0, 0, 0); return 0; } unreferenced object 0xffff8800342540c0 (size 1864): comm "a.out", pid 24109, jiffies 4299060398 (age 27.984s) hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0a 00 07 40 00 00 00 00 00 00 00 00 00 00 00 00 ...@............ backtrace: [] kmemleak_alloc+0x72/0xc0 mm/kmemleak.c:915 [< inline >] kmemleak_alloc_recursive include/linux/kmemleak.h:47 [< inline >] slab_post_alloc_hook mm/slub.c:1335 [< inline >] slab_alloc_node mm/slub.c:2594 [< inline >] slab_alloc mm/slub.c:2602 [] kmem_cache_alloc+0x12d/0x2c0 mm/slub.c:2607 [] sk_prot_alloc+0x69/0x340 net/core/sock.c:1344 [] sk_alloc+0x3a/0x6b0 net/core/sock.c:1419 [] inet6_create+0x2d7/0x1000 net/ipv6/af_inet6.c:173 [] __sock_create+0x37c/0x640 net/socket.c:1162 [< inline >] sock_create net/socket.c:1202 [< inline >] SYSC_socket net/socket.c:1232 [] SyS_socket+0xef/0x1b0 net/socket.c:1212 [] entry_SYSCALL_64_fastpath+0x16/0x7a arch/x86/entry/entry_64.S:185 [] 0xffffffffffffffff unreferenced object 0xffff880034253780 (size 1864): comm "a.out", pid 24109, jiffies 4299060500 (age 27.882s) hex dump (first 32 bytes): 00 00 00 00 00 00 00 00 00 00 00 00 33 dc 00 00 ............3... 0a 00 07 40 00 00 00 00 d8 40 25 34 00 88 ff ff ...@.....@%4.... backtrace: [] kmemleak_alloc+0x72/0xc0 mm/kmemleak.c:915 [< inline >] kmemleak_alloc_recursive include/linux/kmemleak.h:47 [< inline >] slab_post_alloc_hook mm/slub.c:1335 [< inline >] slab_alloc_node mm/slub.c:2594 [< inline >] slab_alloc mm/slub.c:2602 [] kmem_cache_alloc+0x12d/0x2c0 mm/slub.c:2607 [] sk_prot_alloc+0x69/0x340 net/core/sock.c:1344 [] sk_alloc+0x3a/0x6b0 net/core/sock.c:1419 [] sctp_v6_create_accept_sk+0xf0/0x790 net/sctp/ipv6.c:646 [] sctp_accept+0x409/0x6d0 net/sctp/socket.c:3925 [] inet_accept+0xe3/0x660 net/ipv4/af_inet.c:671 [] SYSC_accept4+0x32c/0x630 net/socket.c:1474 [< inline >] SyS_accept4 net/socket.c:1424 [< inline >] SYSC_accept net/socket.c:1508 [] SyS_accept+0x26/0x30 net/socket.c:1505 [] entry_SYSCALL_64_fastpath+0x16/0x7a arch/x86/entry/entry_64.S:185 [] 0xffffffffffffffff On commit 8513342170278468bac126640a5d2d12ffbff106 (Dec 28).