[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAM_iQpVG+ybcv1DAc01y3c=CRmUgMqocEnp-efhVM0c-t4hZ0w@mail.gmail.com>
Date: Sun, 5 Feb 2017 23:22:12 -0800
From: Cong Wang <xiyou.wangcong@...il.com>
To: Mateusz Guzik <mguzik@...hat.com>
Cc: Dmitry Vyukov <dvyukov@...gle.com>,
Al Viro <viro@...iv.linux.org.uk>,
"linux-fsdevel@...r.kernel.org" <linux-fsdevel@...r.kernel.org>,
LKML <linux-kernel@...r.kernel.org>,
David Miller <davem@...emloft.net>,
Rainer Weikusat <rweikusat@...ileactivedefense.com>,
Hannes Frederic Sowa <hannes@...essinduktion.org>,
netdev <netdev@...r.kernel.org>,
Eric Dumazet <edumazet@...gle.com>,
syzkaller <syzkaller@...glegroups.com>
Subject: Re: fs, net: deadlock between bind/splice on af_unix
On Tue, Jan 31, 2017 at 10:14 AM, Mateusz Guzik <mguzik@...hat.com> wrote:
> On Mon, Jan 30, 2017 at 10:44:03PM -0800, Cong Wang wrote:
>> 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);
Powered by blists - more mailing lists