Re: netlink: Add netlink_bound helper and use it in netlink_getname

From: Herbert Xu
Date: Sat Sep 26 2015 - 15:49:41 EST


On Sat, Sep 26, 2015 at 03:45:54PM -0400, Tejun Heo wrote:
> Hello, Herbert.
>
> On Sun, Sep 27, 2015 at 03:41:10AM +0800, Herbert Xu wrote:
> > Thread 1 Thread 2
> > sendmsg getsockname
> > netlink_autobind netlink_getname
> >
> > Thread 2 should not have to do anything special to guarantee that
> > getsockname does not return garbage. It must either be the bound
> > portid if the autobind completed in thread 1 and is visible or it
> > should return zero.
> >
> > As it stands thread 2 may see a portid belonging to somebody else
> > if it catches the autobind in thread 1 trying different portids
> > while roving.
>
> If the fact that thread 1 finished autobind isn't visible to thread 2,
> it's valid for getsockname to return zero. No ordering between the
> two operations is defined. If the fact that thread 1 finished
> autobind is visible to thread 2, ordering is defined and because
> ordering is transitive, by that very ordering, the port number is
> visible to thread 2 too as long as thread 1 does proper barriering.

If the autobind is not complete then netlink_getname must return
zero rather than some garbage portid that belongs to somebody
else's socket. That's what we did before any of this lockless
code was introduced.

If you don't check nlk->bound then you may return garbage.

Cheers,
--
Email: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/