]> granicus.if.org Git - libevent/commitdiff
Suspend read/write on bufferevents during hostname lookup
authorNick Mathewson <nickm@torproject.org>
Sat, 20 Feb 2010 17:55:59 +0000 (12:55 -0500)
committerNick Mathewson <nickm@torproject.org>
Sat, 20 Feb 2010 17:55:59 +0000 (12:55 -0500)
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.

bufferevent-internal.h
bufferevent_sock.c

index ad1f844ecb28e39d4c5e27800ee717e7c172e22f..5be964fd4d8afd1800b24b6110375d22509538ad 100644 (file)
@@ -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 */
index 006c8ec5062263ca5f2f8462faaf47d2f80ce1a7..df048de91556d8831c717fe58611e671d51b88c2 100644 (file)
@@ -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;
+       }
 }
 
 /*