]> granicus.if.org Git - libevent/commitdiff
Make evconnlistener work around bug in older Linux when getting nmapped
authorNick Mathewson <nickm@torproject.org>
Mon, 9 Jan 2012 16:49:41 +0000 (11:49 -0500)
committerNick Mathewson <nickm@torproject.org>
Mon, 9 Jan 2012 16:49:41 +0000 (11:49 -0500)
Older Linuxes sometimes respond to some nmap probes by having accept()
return a success but with socklen 0.  That can lead to confusing behavior
when you go to process the sockaddr.

listener.c

index a440f46508221b915a919342c94eb9bd420a8026..8dcbb0b3f6f96a937032509b739000255ec1dd7b 100644 (file)
@@ -390,6 +390,12 @@ listener_read_cb(evutil_socket_t fd, short what, void *p)
                evutil_socket_t new_fd = accept(fd, (struct sockaddr*)&ss, &socklen);
                if (new_fd < 0)
                        break;
+               if (socklen == 0) {
+                       /* This can happen with some older linux kernels in
+                        * response to nmap. */
+                       evutil_closesocket(new_fd);
+                       continue;
+               }
 
                if (!(lev->flags & LEV_OPT_LEAVE_SOCKETS_BLOCKING))
                        evutil_make_socket_nonblocking(new_fd);