summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Hahn <sebastian@torproject.org>2010-02-08 15:35:34 +0100
committerSebastian Hahn <sebastian@torproject.org>2010-02-08 15:49:54 +0100
commita168cd2a54355c77a72e6553e5e4c5dc844fca50 (patch)
tree43179308db0188273f425158960c78f83780069d
parentdfee17328950628686bf2c78a8983871f36d97cf (diff)
downloadtor-a168cd2a54355c77a72e6553e5e4c5dc844fca50.tar.gz
tor-a168cd2a54355c77a72e6553e5e4c5dc844fca50.zip
Don't use gethostbyname() in resolve_my_address()
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.
-rw-r--r--ChangeLog3
-rw-r--r--src/or/config.c8
2 files changed, 6 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 973f69b36b..62925d8677 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 9d9e029b81..a634f16cb6 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)) {