Thread (20 messages) 20 messages, 4 authors, 2017-02-10

Re: fs, net: deadlock between bind/splice on af_unix

From: Dmitry Vyukov <dvyukov@google.com>
Date: 2017-01-20 22:53:28
Also in: linux-fsdevel, netdev

On Fri, Jan 20, 2017 at 5:57 AM, Cong Wang [off-list ref] wrote:
quoted
quoted
quoted
quoted
quoted
quoted
Why do we do autobind there, anyway, and why is it conditional on
SOCK_PASSCRED?  Note that e.g. for SOCK_STREAM we can bloody well get
to sending stuff without autobind ever done - just use socketpair()
to create that sucker and we won't be going through the connect()
at all.
In the case Dmitry reported, unix_dgram_sendmsg() calls unix_autobind(),
not SOCK_STREAM.
Yes, I've noticed.  What I'm asking is what in there needs autobind triggered
on sendmsg and why doesn't the same need affect the SOCK_STREAM case?
quoted
I guess some lock, perhaps the u->bindlock could be dropped before
acquiring the next one (sb_writer), but I need to double check.
Bad idea, IMO - do you *want* autobind being able to come through while
bind(2) is busy with mknod?

Ping. This is still happening on HEAD.
Thanks for your reminder. Mind to give the attached patch (compile only)
a try? I take another approach to fix this deadlock, which moves the
unix_mknod() out of unix->bindlock. Not sure if there is any unexpected
impact with this way.

I instantly hit:
Oh, sorry about it, I forgot to initialize struct path...

Attached is the updated version, I just did a boot test, no crash at least. ;)

Thanks!
This works! I did not see the deadlock warning, nor any other related crashes.

Tested-by: Dmitry Vyukov <dvyukov@google.com>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help