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

[or-cvs] [tor/maint-0.2.1] Don't use gethostbyname() in resolve_my_address()



Author: Sebastian Hahn <sebastian@xxxxxxxxxxxxxx>
Date: Mon, 8 Feb 2010 15:35:34 +0100
Subject: Don't use gethostbyname() in resolve_my_address()
Commit: a168cd2a54355c77a72e6553e5e4c5dc844fca50

Tor has tor_lookup_hostname(), which prefers ipv4 addresses automatically.
Bug 1244 occured because gethostbyname() returned an ipv6 address, which
Tor cannot handle currently. Fixes bug 1244; bugfix on 0.0.2pre25.
Reported by Mike Mestnik.
---
 ChangeLog       |    3 +++
 src/or/config.c |    8 +++-----
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 973f69b..62925d8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -20,6 +20,9 @@ Changes in version 0.2.1.23 - 2010-0?-??
       on, detect the OpenSSL version at run-time, not compile time.  We
       need to do this because Apple doesn't update its dev-tools headers
       when it updates its libraries in a security patch.
+    - Refactor resolve_my_address() a little, to not use gethostbyname()
+      anymore. Fixes bug 1244; bugfix on 0.0.2pre25. Reported by Mike
+      Mestnik.
 
   o Minor features:
     - Avoid a mad rush at the beginning of each month when each client
diff --git a/src/or/config.c b/src/or/config.c
index 9d9e029..a634f16 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -2339,7 +2339,7 @@ resolve_my_address(int warn_severity, or_options_t *options,
                    uint32_t *addr_out, char **hostname_out)
 {
   struct in_addr in;
-  struct hostent *rent;
+  uint32_t addr;
   char hostname[256];
   int explicit_ip=1;
   int explicit_hostname=1;
@@ -2369,8 +2369,7 @@ resolve_my_address(int warn_severity, or_options_t *options,
   if (tor_inet_aton(hostname, &in) == 0) {
     /* then we have to resolve it */
     explicit_ip = 0;
-    rent = (struct hostent *)gethostbyname(hostname);
-    if (!rent) {
+    if(!tor_lookup_hostname(hostname, &addr)) {
       uint32_t interface_ip;
 
       if (explicit_hostname) {
@@ -2393,8 +2392,7 @@ resolve_my_address(int warn_severity, or_options_t *options,
              "local interface. Using that.", tmpbuf);
       strlcpy(hostname, "<guessed from interfaces>", sizeof(hostname));
     } else {
-      tor_assert(rent->h_length == 4);
-      memcpy(&in.s_addr, rent->h_addr, rent->h_length);
+      in.s_addr = htonl(addr);
 
       if (!explicit_hostname &&
           is_internal_IP(ntohl(in.s_addr), 0)) {
-- 
1.6.5