diff --git a/net/socket.c b/net/socket.c index 7a6b5f2e4eba..cdf6b9621f25 100644 --- a/net/socket.c +++ b/net/socket.c @@ -1392,9 +1392,14 @@ SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen) (struct sockaddr *) &address, addrlen); } - fput_light(sock->file, fput_needed); - if (!err) + if (!err) { + if (sock->sk) + sock_hold(sock->sk); sockev_notify(SOCKEV_BIND, sock); + if (sock->sk) + sock_put(sock->sk); + } + fput_light(sock->file, fput_needed); } return err; } @@ -1421,9 +1426,14 @@ SYSCALL_DEFINE2(listen, int, fd, int, backlog) if (!err) err = sock->ops->listen(sock, backlog); - fput_light(sock->file, fput_needed); - if (!err) + if (!err) { + if (sock->sk) + sock_hold(sock->sk); sockev_notify(SOCKEV_LISTEN, sock); + if (sock->sk) + sock_put(sock->sk); + } + fput_light(sock->file, fput_needed); } return err; }