summaryrefslogtreecommitdiff
path: root/bufferevent_sock.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2009-07-30 20:41:31 +0000
committerNick Mathewson <nickm@torproject.org>2009-07-30 20:41:31 +0000
commitd1a2254bf25e449cf7f0f989e0e9e05792fb585a (patch)
treec411b24ae41ce59549646ccab21eea8deba2a779 /bufferevent_sock.c
parent7a2a51a3a1ea6ece8bab492f9f494dece207eaf7 (diff)
downloadlibevent-d1a2254bf25e449cf7f0f989e0e9e05792fb585a.tar.gz
Fix some bugs in bufferevent_socket_connect
svn:r1398
Diffstat (limited to 'bufferevent_sock.c')
-rw-r--r--bufferevent_sock.c12
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);
}