Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1570442 > unrolled thread
| Started by | Cong Wang <xiyou.wangcong@gmail.com> |
|---|---|
| First post | 2017-01-31 07:50 +0100 |
| Last post | 2017-02-10 02:40 +0100 |
| Articles | 5 — 2 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: fs, net: deadlock between bind/splice on af_unix Cong Wang <xiyou.wangcong@gmail.com> - 2017-01-31 07:50 +0100
Re: fs, net: deadlock between bind/splice on af_unix Mateusz Guzik <mguzik@redhat.com> - 2017-01-31 19:20 +0100
Re: fs, net: deadlock between bind/splice on af_unix Cong Wang <xiyou.wangcong@gmail.com> - 2017-02-06 08:30 +0100
Re: fs, net: deadlock between bind/splice on af_unix Mateusz Guzik <mguzik@redhat.com> - 2017-02-07 15:30 +0100
Re: fs, net: deadlock between bind/splice on af_unix Cong Wang <xiyou.wangcong@gmail.com> - 2017-02-10 02:40 +0100
| From | Cong Wang <xiyou.wangcong@gmail.com> |
|---|---|
| Date | 2017-01-31 07:50 +0100 |
| Subject | Re: fs, net: deadlock between bind/splice on af_unix |
| Message-ID | <t5Aqm-5Qs-17@gated-at.bofh.it> |
On Thu, Jan 26, 2017 at 10:41 PM, Mateusz Guzik <mguzik@redhat.com> wrote: > On Thu, Jan 26, 2017 at 09:11:07PM -0800, Cong Wang wrote: >> On Thu, Jan 26, 2017 at 3:29 PM, Mateusz Guzik <mguzik@redhat.com> wrote: >> > Currently the file creation is potponed until unix_bind can no longer >> > fail otherwise. With it reordered, it may be someone races you with a >> > different path and now you are left with a file to clean up. Except it >> > is quite unclear for me if you can unlink it. >> >> What races do you mean here? If you mean someone could get a >> refcount of that file, it could happen no matter we have bindlock or not >> since it is visible once created. The filesystem layer should take care of >> the file refcount so all we need to do here is calling path_put() as in my >> patch. Or if you mean two threads calling unix_bind() could race without >> binlock, only one of them should succeed the other one just fails out. > > Two threads can race and one fails with EINVAL. > > With your patch there is a new file created and it is unclear what to > do with it - leaving it as it is sounds like the last resort and > unlinking it sounds extremely fishy as it opens you to games played by > the user. But the file is created and visible to users too even without my patch, the file is also put when the unix sock is released. So the only difference my patch makes is bindlock is no longer taken during file creation, which does not seem to be the cause of the problem you complain here. Mind being more specific?
[toc] | [next] | [standalone]
| From | Mateusz Guzik <mguzik@redhat.com> |
|---|---|
| Date | 2017-01-31 19:20 +0100 |
| Message-ID | <t5Lc6-3XV-3@gated-at.bofh.it> |
| In reply to | #1570442 |
On Mon, Jan 30, 2017 at 10:44:03PM -0800, Cong Wang wrote: > On Thu, Jan 26, 2017 at 10:41 PM, Mateusz Guzik <mguzik@redhat.com> wrote: > > On Thu, Jan 26, 2017 at 09:11:07PM -0800, Cong Wang wrote: > >> On Thu, Jan 26, 2017 at 3:29 PM, Mateusz Guzik <mguzik@redhat.com> wrote: > >> > Currently the file creation is potponed until unix_bind can no longer > >> > fail otherwise. With it reordered, it may be someone races you with a > >> > different path and now you are left with a file to clean up. Except it > >> > is quite unclear for me if you can unlink it. > >> > >> What races do you mean here? If you mean someone could get a > >> refcount of that file, it could happen no matter we have bindlock or not > >> since it is visible once created. The filesystem layer should take care of > >> the file refcount so all we need to do here is calling path_put() as in my > >> patch. Or if you mean two threads calling unix_bind() could race without > >> binlock, only one of them should succeed the other one just fails out. > > > > Two threads can race and one fails with EINVAL. > > > > With your patch there is a new file created and it is unclear what to > > do with it - leaving it as it is sounds like the last resort and > > unlinking it sounds extremely fishy as it opens you to games played by > > the user. > > But the file is created and visible to users too even without my patch, > the file is also put when the unix sock is released. So the only difference > my patch makes is bindlock is no longer taken during file creation, which > does not seem to be the cause of the problem you complain here. > > 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.
[toc] | [prev] | [next] | [standalone]
| From | Cong Wang <xiyou.wangcong@gmail.com> |
|---|---|
| Date | 2017-02-06 08:30 +0100 |
| Message-ID | <t7LUm-1Ov-15@gated-at.bofh.it> |
| In reply to | #1570965 |
On Tue, Jan 31, 2017 at 10:14 AM, Mateusz Guzik <mguzik@redhat.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);
[toc] | [prev] | [next] | [standalone]
| From | Mateusz Guzik <mguzik@redhat.com> |
|---|---|
| Date | 2017-02-07 15:30 +0100 |
| Message-ID | <t8eWl-41t-7@gated-at.bofh.it> |
| In reply to | #1574418 |
On Sun, Feb 05, 2017 at 11:22:12PM -0800, Cong Wang wrote: > On Tue, Jan 31, 2017 at 10:14 AM, Mateusz Guzik <mguzik@redhat.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); 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.
[toc] | [prev] | [next] | [standalone]
| From | Cong Wang <xiyou.wangcong@gmail.com> |
|---|---|
| Date | 2017-02-10 02:40 +0100 |
| Message-ID | <t98lQ-5ij-15@gated-at.bofh.it> |
| In reply to | #1575765 |
On Tue, Feb 7, 2017 at 6:20 AM, Mateusz Guzik <mguzik@redhat.com> wrote: > > 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. > Which is expected, right? No one guarantees the success of file creation is the success of bind, the previous code does but it is not part of API AFAIK. Should a sane user-space application check the file creation for a successful bind() or just check its return value? > What to do with the file now? > We just do what unix_release_sock() does, so why do you keep asking the same question? If you still complain about the race with user-space, think about the same race in-between a successful bind() and close(), nothing is new.
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web