epoll: Fix leaked listen bug (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 28 Sep 2017 01:40:03 +0000 (21:40 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 29 Sep 2017 14:00:03 +0000 (10:00 -0400)
commit48cde810182208ba183444bbcf06edbdee20eac7
tree67521f8d1fd97710c65ce7bcb0a6d371c184812b
parent83d1d75a6ef34a88660c239f9141c03d87497b3b
epoll: Fix leaked listen bug (XCC)

During the close callbacks for a data FD, the rock CB was called first.
That would close the listen FD (if it was open).  Then we'd call the
epoll CB, which would do an __epoll_ctl_del().  That would open the
listen FD.  However, at that point, the callback that would make sure
the listen FD was closed wouldn't run (it already ran).

The end result for dropbear was that listen FDs were getting leaked.
The DB parent would have the child's listen line open (e.g.
/net/tcp/1/listen, while the child had 1/data).  The child also had the
parent's 0/listen.  The latter had the effect of us never being able to
restart sshd while a client was connected, since someone would always be
listening on port 22.

Rebuild glibc and dropbear.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/plan9_sockets.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/sys/plan9_helpers.h
user/iplib/epoll.c