Messages in this thread | | | Date | Tue, 01 Dec 2015 15:07:58 +0100 | From | Daniel Borkmann <> | Subject | Re: memory leak in do_ipv6_setsockopt |
| |
On 12/01/2015 02:36 PM, Eric Dumazet wrote: > On Tue, 2015-12-01 at 13:27 +0100, Dmitry Vyukov wrote: >> Hello, >> >> The following program causes a memory leak : >> >> // autogenerated by syzkaller (http://github.com/google/syzkaller) >> #include <syscall.h> >> #include <sys/types.h> >> #include <sys/socket.h> >> #include <string.h> >> #include <stdint.h> >> #include <linux/in.h> >> #include <linux/socket.h> >> >> int main() >> { >> long r1 = syscall(SYS_socket, PF_INET6, >> SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_SCTP); >> const char *opt = "\x15\x53\x5e\x2d\x97\xab\xe1"; >> long r3 = syscall(SYS_setsockopt, r1, 0x29ul, 0x6ul, opt, 0x7ul); >> return 0; >> } >> >> >> unreferenced object 0xffff880039a55260 (size 64): >> comm "executor", pid 11746, jiffies 4298984475 (age 16.078s) >> hex dump (first 32 bytes): >> 2f 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: >> [< inline >] kmalloc include/linux/slab.h:463 >> [<ffffffff848a2f5f>] sock_kmalloc+0x7f/0xc0 net/core/sock.c:1774 >> [<ffffffff84e5bea0>] do_ipv6_setsockopt.isra.7+0x15d0/0x2830 >> net/ipv6/ipv6_sockglue.c:483 >> [<ffffffff84e5d19b>] ipv6_setsockopt+0x9b/0x140 net/ipv6/ipv6_sockglue.c:885 >> [<ffffffff8544616c>] sctp_setsockopt+0x15c/0x36c0 net/sctp/socket.c:3702 >> [<ffffffff848a2035>] sock_common_setsockopt+0x95/0xd0 net/core/sock.c:2645 >> [< inline >] SYSC_setsockopt net/socket.c:1757 >> [<ffffffff8489f1d8>] SyS_setsockopt+0x158/0x240 net/socket.c:1736 >> >> >> I confirmed that running this program in a loop steadily increases >> number of objects in kmalloc-64 slab. The leak does not happen with >> IPPROTO_TCP, so probably it is sctp-related. > > Thanks for the report. > > Probably fixed by : > > diff --git a/net/sctp/socket.c b/net/sctp/socket.c > index 897c01c029ca..8079ecd8465d 100644 > --- a/net/sctp/socket.c > +++ b/net/sctp/socket.c > @@ -7375,6 +7375,12 @@ struct proto sctp_prot = { > > #if IS_ENABLED(CONFIG_IPV6) > > +static void sctp_v6_destroy_sock(struct sock *sk) > +{ > + sctp_destroy_sock(sk); > + inet6_destroy_sock(sk); > +}
Yeah, we miss inet6_destroy_sock() in SCTP. :-(
Looks good to me.
> struct proto sctpv6_prot = { > .name = "SCTPv6", > .owner = THIS_MODULE, > @@ -7384,7 +7390,7 @@ struct proto sctpv6_prot = { > .accept = sctp_accept, > .ioctl = sctp_ioctl, > .init = sctp_init_sock, > - .destroy = sctp_destroy_sock, > + .destroy = sctp_v6_destroy_sock, > .shutdown = sctp_shutdown, > .setsockopt = sctp_setsockopt, > .getsockopt = sctp_getsockopt, > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ >
| |