Fix socket option bug in accept() (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 2 Sep 2015 21:53:30 +0000 (17:53 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
We were carrying the listening socket's options through to the child.
These options include O_NONBLOCK and O_CLOEXEC.  Those are not supposed
to be inherited.  Instead the caller either does an fcntl() or uses
an accept4() shim (nonexistent at this point).

Rebuild glibc.

tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/accept.c

index 52200d9..968fb2f 100644 (file)
@@ -70,9 +70,12 @@ int accept(int fd, __SOCKADDR_ARG addr, socklen_t * __restrict alen)
                         * nfd will be the FD for that conv's data file.  sock_data will trade
                         * our lcfd for the data file fd.  even if it fails, sock_data will
                         * close our lcfd for us.  when it succeeds, it'll open the data file
-                        * before closing lcfd, which will keep the converstation alive. */
-                       nfd = _sock_data(lcfd, net, r->domain, r->stype | r->sopts,
-                                        r->protocol, &nr);
+                        * before closing lcfd, which will keep the converstation alive.
+                        *
+                        * Note, we pass the listen socket's stype, but not it's sopts.  If
+                        * we implement something like accept4, that's where those sopts
+                        * (e.g. O_CLOEXEC, O_NONBLOCK) will come from. */
+                       nfd = _sock_data(lcfd, net, r->domain, r->stype, r->protocol, &nr);
                        if (nfd < 0)
                                return -1;