diff options
author | Nick Mathewson <nickm@torproject.org> | 2009-07-30 20:41:31 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2009-07-30 20:41:31 +0000 |
commit | d1a2254bf25e449cf7f0f989e0e9e05792fb585a (patch) | |
tree | c411b24ae41ce59549646ccab21eea8deba2a779 /bufferevent_sock.c | |
parent | 7a2a51a3a1ea6ece8bab492f9f494dece207eaf7 (diff) | |
download | libevent-d1a2254bf25e449cf7f0f989e0e9e05792fb585a.tar.gz |
Fix some bugs in bufferevent_socket_connect
svn:r1398
Diffstat (limited to 'bufferevent_sock.c')
-rw-r--r-- | bufferevent_sock.c | 12 |
1 files changed, 12 insertions, 0 deletions
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); } |