From f03251671879fdc9fb37acd6e724c65adfc43bd6 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Mon, 9 Jan 2012 11:33:38 -0500 Subject: [PATCH 1/2] Remove bogus casts of socket to int before calling ev_callback This should make 64-bit windows act better. Found by Mark Heily. --- event.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/event.c b/event.c index 868e865a..a1763566 100644 --- a/event.c +++ b/event.c @@ -1046,7 +1046,7 @@ event_signal_closure(struct event_base *base, struct event *ev) ev->ev_ncalls = ncalls; if (ncalls == 0) ev->ev_pncalls = NULL; - (*ev->ev_callback)((int)ev->ev_fd, ev->ev_res, ev->ev_arg); + (*ev->ev_callback)(ev->ev_fd, ev->ev_res, ev->ev_arg); EVBASE_ACQUIRE_LOCK(base, th_base_lock); should_break = base->event_break; @@ -1277,7 +1277,7 @@ event_persist_closure(struct event_base *base, struct event *ev) event_add_internal(ev, &run_at, 1); } EVBASE_RELEASE_LOCK(base, th_base_lock); - (*ev->ev_callback)((int)ev->ev_fd, ev->ev_res, ev->ev_arg); + (*ev->ev_callback)(ev->ev_fd, ev->ev_res, ev->ev_arg); } /* @@ -1327,7 +1327,7 @@ event_process_active_single_queue(struct event_base *base, case EV_CLOSURE_NONE: EVBASE_RELEASE_LOCK(base, th_base_lock); (*ev->ev_callback)( - (int)ev->ev_fd, ev->ev_res, ev->ev_arg); + ev->ev_fd, ev->ev_res, ev->ev_arg); break; } From ecfc720a4f7666d468413a3b9b29908bff5ddb82 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Mon, 9 Jan 2012 11:49:41 -0500 Subject: [PATCH 2/2] Make evconnlistener work around bug in older Linux when getting nmapped 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 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/listener.c b/listener.c index a440f465..8dcbb0b3 100644 --- a/listener.c +++ b/listener.c @@ -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);