From mboxrd@z Thu Jan 1 00:00:00 1970 From: John Dykstra Subject: Re: [PATCH 2/2] [RFC] Add c/r support for connected INET sockets Date: Thu, 08 Oct 2009 14:47:13 +0000 Message-ID: <1255013233.8033.14.camel@Maple> References: <1254932945-12578-1-git-send-email-danms@us.ibm.com> <1254932945-12578-3-git-send-email-danms@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1254932945-12578-3-git-send-email-danms@us.ibm.com> Sender: netdev-owner@vger.kernel.org To: Dan Smith Cc: containers@lists.osdl.org, netdev@vger.kernel.org List-Id: containers.vger.kernel.org On Wed, 2009-10-07 at 09:29 -0700, Dan Smith wrote: > This patch adds basic support for C/R of open INET sockets. I think > that > all the important bits of the TCP and ICSK socket structures is saved, > but I think there is still some additional IPv6 stuff that needs to be > handled. I think this patch breaks code that was already in do_sock_restore(): struct sock *do_sock_restore(struct ckpt_ctx *ctx) { struct ckpt_hdr_socket *h; struct socket *sock; int ret; h = ckpt_read_obj_type(ctx, sizeof(*h), CKPT_HDR_SOCKET); if (IS_ERR(h)) return ERR_PTR(PTR_ERR(h)); /* silently clear flags, e.g. SOCK_NONBLOCK or SOCK_CLOEXEC */ h->sock.type &= SOCK_TYPE_MASK; ret = sock_create(h->sock_common.family, h->sock.type, 0, &sock); if (ret < 0) goto err; You're passing 0 as the protocol value to sock_create(). This ultimately gets passed to the address family's create() function. inet_create() (and its IPv6 companion) use that protocol value as the key when they search for the proper inet_protosw, which in turn gets mapped to the struct proto and passed to sk_prot_alloc(). In address families INET and AF_INET6, the struct sock is different sizes for different protocols. This is implemented by the struct proto specifying which cache the struct sock comes from. So by passing in 0 all the time to sock_create(), you're getting a struct sock that may not be the right size. Memory corruption and madness follow. -- John