[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] [tor/release-0.2.2] Fix check for failed evdns request creation



commit 68d5b6bc5213b7eb411810361e04fe371ef19048
Author: Nick Mathewson <nickm@xxxxxxxxxxxxxx>
Date:   Sun Jan 9 18:54:45 2011 -0500

    Fix check for failed evdns request creation
    
    When using libevent 2, we use evdns_base_resolve_*().  When not, we
    fake evdns_base_resolve_*() using evdns_resolve_*().
    
    Our old check was looking for negative values (like libevent 2
    returns), but our eventdns.c code returns 1.  This code makes the
    check just test for nonzero.
    
    Note that this broken check was not for _resolve_ failures or even for
    failures to _launch_ a resolve: it was for failures to _create_ or
    _encode_ a resolve request.
    
    Bug introduced in 81eee0ecfff3dac1e9438719d2f7dc0ba7e84a71; found by
    lodger; uploaded to trac by rransom.  Bug 2363.  Fix on 0.2.2.6-alpha.
---
 changes/bug2363 |    6 ++++++
 src/or/dns.c    |   10 +++++++---
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/changes/bug2363 b/changes/bug2363
new file mode 100644
index 0000000..179925f
--- /dev/null
+++ b/changes/bug2363
@@ -0,0 +1,6 @@
+  o Minor bugfixes
+    - Correctly detect failures to create DNS requests when using Libevent
+      versions before v2.  (Before Libevent 2, we used our own evdns
+      implementation.  Its return values for Libevent's evdns_resolve_*()
+      functions are not consistent with those from Libevent.) Found by
+      Lodger; fixes bug 2363; bugfix on 0.2.2.6-alpha.
diff --git a/src/or/dns.c b/src/or/dns.c
index 5c76301..6393171 100644
--- a/src/or/dns.c
+++ b/src/or/dns.c
@@ -54,12 +54,16 @@ struct evdns_request;
   evdns_config_windows_nameservers()
 #define evdns_base_set_option_(base, opt, val) \
   evdns_set_option((opt),(val),DNS_OPTIONS_ALL)
+/* Note: our internal eventdns.c, plus libevent 1.4, used a 1 return to
+ * signify failure to launch a resolve. Libevent 2.0 uses a -1 return to
+ * signify a failure on a resolve, though if we're on libevent 2.0, we should
+ * have event2/dns.h and never hit these macros.  Regardless, 0 is success. */
 #define evdns_base_resolve_ipv4(base, addr, options, cb, ptr) \
-  ((evdns_resolve_ipv4(addr, options, cb, ptr)<0) ? NULL : ((void*)1))
+  ((evdns_resolve_ipv4(addr, options, cb, ptr)!=0) ? NULL : ((void*)1))
 #define evdns_base_resolve_reverse(base, addr, options, cb, ptr) \
-  ((evdns_resolve_reverse(addr, options, cb, ptr)<0) ? NULL : ((void*)1))
+  ((evdns_resolve_reverse(addr, options, cb, ptr)!=0) ? NULL : ((void*)1))
 #define evdns_base_resolve_reverse_ipv6(base, addr, options, cb, ptr) \
-  ((evdns_resolve_reverse_ipv6(addr, options, cb, ptr)<0) ? NULL : ((void*)1))
+  ((evdns_resolve_reverse_ipv6(addr, options, cb, ptr)!=0) ? NULL : ((void*)1))
 
 #elif defined(LIBEVENT_VERSION_NUMBER) && LIBEVENT_VERSION_NUMBER < 0x02000303
 #define evdns_base_set_option_(base, opt, val) \