From: Nick Mathewson Date: Thu, 30 Jul 2009 20:41:31 +0000 (+0000) Subject: Fix some bugs in bufferevent_socket_connect X-Git-Tag: release-2.0.3-alpha~140 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d1a2254bf25e449cf7f0f989e0e9e05792fb585a;p=libevent Fix some bugs in bufferevent_socket_connect svn:r1398 --- diff --git a/ChangeLog b/ChangeLog index 8a27e2a8..c788d4f7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,8 @@ Changes in 2.0.3-alpha: o Try to compile better with MSVC: patches from Brodie Thiesfield o New evconnlistener_get_fd function to expose a listener's associated socket. o Expose an ev_socklen_t type for consistent use across platforms. + o Make bufferevenr_socket_connect() work when the original fd was -1. + o Fix a bug in bufferevent_socket_connect() when the connection succeeds too quickly. Changes in 2.0.2-alpha: o Add a new flag to bufferevents to make all callbacks automatically deferred. diff --git a/bufferevent_sock.c b/bufferevent_sock.c index 50c139c6..f1eb0777 100644 --- a/bufferevent_sock.c +++ b/bufferevent_sock.c @@ -282,6 +282,7 @@ bufferevent_socket_connect(struct bufferevent *bev, evutil_socket_t fd; int r; int result=-1; + int ownfd = 0; _bufferevent_incref_and_lock(bev); @@ -289,9 +290,19 @@ bufferevent_socket_connect(struct bufferevent *bev, goto done; fd = bufferevent_getfd(bev); + if (fd < 0) { + fd = socket(sa->sa_family, SOCK_STREAM, 0); + if (fd < 0) + goto done; + if (evutil_make_socket_nonblocking(fd)<0) + goto done; + ownfd = 1; + } r = evutil_socket_connect(&fd, sa, socklen); if (r < 0) { _bufferevent_run_eventcb(bev, BEV_EVENT_ERROR); + if (ownfd) + EVUTIL_CLOSESOCKET(fd); /* do something about the error? */ goto done; } @@ -305,6 +316,7 @@ bufferevent_socket_connect(struct bufferevent *bev, } } else { /* The connect succeeded already. How odd. */ + result = 0; _bufferevent_run_eventcb(bev, BEV_EVENT_CONNECTED); }