summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2010-02-20 12:55:59 -0500
committerNick Mathewson <nickm@torproject.org>2010-02-20 12:55:59 -0500
commitdb08f640d543bd4ef32ffe1f83c8aeca77bb0ce0 (patch)
treeea621727aebf35c6835031be18c602072402944f
parent4faeaea90e5d7a5d76acd8891ba88d4ed099edbd (diff)
downloadlibevent-db08f640d543bd4ef32ffe1f83c8aeca77bb0ce0.tar.gz
Suspend read/write on bufferevents during hostname lookup
When we're doing a lookup in preparation for doing a connect, we might have an unconnected socket on hand, and mustn't actually do any reading or writing with it.
-rw-r--r--bufferevent-internal.h3
-rw-r--r--bufferevent_sock.c13
2 files changed, 14 insertions, 2 deletions
diff --git a/bufferevent-internal.h b/bufferevent-internal.h
index ad1f844e..5be964fd 100644
--- a/bufferevent-internal.h
+++ b/bufferevent-internal.h
@@ -53,6 +53,9 @@ extern "C" {
#define BEV_SUSPEND_BW 0x02
/* On a base bufferevent: when we have emptied the group's bandwidth bucket. */
#define BEV_SUSPEND_BW_GROUP 0x04
+/* On a socket bufferevent: can't do any operations while we're waiting for
+ * name lookup to finish. */
+#define BEV_SUSPEND_LOOKUP 0x08
struct bufferevent_rate_limit_group {
/** List of all members in the group */
diff --git a/bufferevent_sock.c b/bufferevent_sock.c
index 006c8ec5..df048de9 100644
--- a/bufferevent_sock.c
+++ b/bufferevent_sock.c
@@ -417,6 +417,9 @@ bufferevent_connect_getaddrinfo_cb(int result, struct evutil_addrinfo *ai,
int r;
BEV_LOCK(bev);
+ bufferevent_unsuspend_write(bev, BEV_SUSPEND_LOOKUP);
+ bufferevent_unsuspend_read(bev, BEV_SUSPEND_LOOKUP);
+
if (result != 0) {
/* XXX Communicate the error somehow. */
_bufferevent_run_eventcb(bev, BEV_EVENT_ERROR);
@@ -452,14 +455,20 @@ bufferevent_socket_connect_hostname(struct bufferevent *bev,
hint.ai_protocol = IPPROTO_TCP;
hint.ai_socktype = SOCK_STREAM;
+ bufferevent_suspend_write(bev, BEV_SUSPEND_LOOKUP);
+ bufferevent_suspend_read(bev, BEV_SUSPEND_LOOKUP);
+
bufferevent_incref(bev);
err = evutil_getaddrinfo_async(evdns_base, hostname, portbuf,
&hint, bufferevent_connect_getaddrinfo_cb, bev);
- if (err == 0)
+ if (err == 0) {
return 0;
- else
+ } else {
+ bufferevent_unsuspend_write(bev, BEV_SUSPEND_LOOKUP);
+ bufferevent_unsuspend_read(bev, BEV_SUSPEND_LOOKUP);
return -1;
+ }
}
/*