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

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

From: Mateusz Guzik <hidden>
Date: 2017-02-07 14:20:42
Also in: linux-fsdevel, lkml

On Sun, Feb 05, 2017 at 11:22:12PM -0800, Cong Wang wrote:
On Tue, Jan 31, 2017 at 10:14 AM, Mateusz Guzik [off-list ref] wrote:
quoted
On Mon, Jan 30, 2017 at 10:44:03PM -0800, Cong Wang wrote:
quoted
Mind being more specific?
Consider 2 threads which bind the same socket, but with different paths.

Currently exactly one file will get created, the one used to bind.

With your patch both threads can succeed creating their respective
files, but only one will manage to bind. The other one must error out,
but it already created a file it is unclear what to do with.
In this case, it simply puts the path back:

        err = -EINVAL;
        if (u->addr)
                goto out_up;
[...]

out_up:
        mutex_unlock(&u->bindlock);
out_put:
        if (err)
                path_put(&path);
out:
        return err;


Which is what unix_release_sock() does too:

        if (path.dentry)
                path_put(&path);
Yes, but unix_release_sock is expected to leave the file behind.
Note I'm not claiming there is a leak, but that racing threads will be
able to trigger a condition where you create a file and fail to bind it.

What to do with the file now?

Untested, but likely a working solution would rework the code so that
e.g. a flag is set and the lock can be dropped.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help