This cleanup routine checks for unattached sockets that we instantiated and calls sock_release() on them to avoid leaking the struct socket when their buffers are consumed and the struct sock is free'd. Signed-off-by: Dan Smith <danms@xxxxxxxxxx> --- checkpoint/objhash.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) diff --git a/checkpoint/objhash.c b/checkpoint/objhash.c index 9750483..5626707 100644 --- a/checkpoint/objhash.c +++ b/checkpoint/objhash.c @@ -247,6 +247,18 @@ static void obj_sock_drop(void *ptr) sock_put((struct sock *) ptr); } +static void cleanup_sock(void *ptr) +{ + struct sock *sk = (struct sock *) ptr; + + if (sk->sk_socket && !sk->sk_socket->file) { + struct socket *sock = sk->sk_socket; + sock_orphan(sk); + sock->sk = NULL; + sock_release(sock); + } +} + static struct ckpt_obj_ops ckpt_obj_ops[] = { /* ignored object */ { @@ -384,6 +396,7 @@ static struct ckpt_obj_ops ckpt_obj_ops[] = { .ref_grab = obj_sock_grab, .checkpoint = checkpoint_sock, .restore = restore_sock, + .cleanup = cleanup_sock, }, }; -- 1.6.2.5 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers