On Thu, Feb 07, 2019 at 04:27:13PM +0100, Miklos Szeredi wrote: > On Thu, Feb 7, 2019 at 4:20 PM Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > > > > On Thu, Feb 07, 2019 at 03:20:06PM +0100, Miklos Szeredi wrote: > > > > > > Am I right assuming that this queue-modifying operation is accept(), removing > > > > an embryo unix_sock from the queue of listener and thus hiding SCM_RIGHTS in > > > > _its_ queue from scan_children()? > > > > > > Hmm... How about just receiving an SCM_RIGHTS socket (which was a > > > candidate) from the queue of the peeked socket? > > > > Right, skb unlinked before unix_detach_fds(). I was actually thinking of a stream > > case, where unlink is done after that... > > > > *grumble* > > > > The entire thing is far too brittle for my taste ;-/ > > If it gets used as part of io_uring, I guess it's worth a fresh look. > I wrote it without basically any experience with either networking or > garbage collecting, so no wonder it has rough edges. It had a plenty of those edges before your changes as well - I'm not blaming you for that mess, in case that's not obvious from what I'd written. I'm trying to put together some formal description of what's going on in there. Another question, BTW: updates of user->unix_inflight would seem to be movable into the callers of unix_{not,}inflight(). Any objections against lifting it into unix_{attach,detach}_fds()? We do, after all, have fp->count right there, so what's the point incrementing/decrementing the sucker one-by-one? _And_ we are checking it right there (in too_many_unix_fds() called from unix_attach_fds())...