]> granicus.if.org Git - libevent/commitdiff
Fix some bugs in bufferevent_socket_connect
authorNick Mathewson <nickm@torproject.org>
Thu, 30 Jul 2009 20:41:31 +0000 (20:41 +0000)
committerNick Mathewson <nickm@torproject.org>
Thu, 30 Jul 2009 20:41:31 +0000 (20:41 +0000)
svn:r1398

ChangeLog
bufferevent_sock.c

index 8a27e2a8578dd81e7c2ac7f6b3753d476b90f7b2..c788d4f70777ed1e9862caff0b6f685a81229aa2 100644 (file)
--- 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.
index 50c139c62270c8a88ec59162b08c9d3a47d7b8b6..f1eb07778ffef62aa316ee098cff391341fe02e3 100644 (file)
@@ -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);
        }