On Tue, Nov 24, 2015 at 04:30:01PM -0500, Jason Baron wrote: > So looking at this trace I think its the other->sk_socket that gets > freed and then we call sk_wake_async() on it. > > We could I think grab the socket reference there with unix_state_lock(), > since that is held by unix_release_sock() before the final iput() is called. > > So something like below might work (compile tested only):
Ewww... > +struct socket *unix_peer_get_socket(struct sock *s) > +{ > + struct socket *peer; > + > + unix_state_lock(s); > + peer = s->sk_socket; > + if (peer) > + __iget(SOCK_INODE(s->sk_socket)); > + unix_state_unlock(s); > + > + return peer; > out_err: > + if (other_socket) > + iput(SOCK_INODE(other_socket)); > scm_destroy(&scm); > return sent ? : err; > } Interplay between socket, file and inode lifetimes is already too convoluted, and this just makes it nastier. I don't have a ready solution at the moment, but this one is too ugly to live. Al, digging through RTFS(net/unix/af_unix.c) right now... -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html