From db08f640d543bd4ef32ffe1f83c8aeca77bb0ce0 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Sat, 20 Feb 2010 12:55:59 -0500 Subject: [PATCH] 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. --- bufferevent-internal.h | 3 +++ bufferevent_sock.c | 13 +++++++++++-- 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; + } } /* -- 2.40.0