diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-05-22 01:39:31 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-05-22 01:39:31 +0000 |
commit | 1837b5670ffdce778df0d97d3b0a922a6d2aec63 (patch) | |
tree | affeee8d8d815cede3e2c1d09279abc241635fd3 | |
parent | 993c4973250f3f14135199714f8f243629c3c09b (diff) | |
download | tor-1837b5670ffdce778df0d97d3b0a922a6d2aec63.tar.gz tor-1837b5670ffdce778df0d97d3b0a922a6d2aec63.zip |
r12840@catbus: nickm | 2007-05-21 21:39:23 -0400
Backport 10237: use the same logic as in read_all when reading resolv.conf. Maybe this fixes bug 433.
svn:r10243
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | src/or/dns.c | 7 | ||||
-rw-r--r-- | src/or/eventdns.c | 13 |
3 files changed, 15 insertions, 7 deletions
@@ -24,6 +24,8 @@ Changes in version 0.1.2.14 - 2007-0?-?? network-statuses. - Correctly back-off from requesting router descriptors that we are having a hard time downloading. + - Read resolv.conf files correctly on platforms where read() returns + partial results on small file reads. o Minor features: - When routers publish SVN revisions in their router descriptors, diff --git a/src/or/dns.c b/src/or/dns.c index 47f833c4be..037805a9e8 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -1519,6 +1519,7 @@ configure_nameservers(int force) or_options_t *options; const char *conf_fname; struct stat st; + int r; options = get_options(); conf_fname = options->ServerDNSResolvConfFile; #ifndef MS_WINDOWS @@ -1543,9 +1544,9 @@ configure_nameservers(int force) evdns_clear_nameservers_and_suspend(); } log_info(LD_EXIT, "Parsing resolver configuration in '%s'", conf_fname); - if (evdns_resolv_conf_parse(DNS_OPTIONS_ALL, conf_fname)) { - log_warn(LD_EXIT, "Unable to parse '%s', or no nameservers in '%s'", - conf_fname, conf_fname); + if ((r = evdns_resolv_conf_parse(DNS_OPTIONS_ALL, conf_fname))) { + log_warn(LD_EXIT, "Unable to parse '%s', or no nameservers in '%s' (%d)", + conf_fname, conf_fname, r); return -1; } if (evdns_count_nameservers() == 0) { diff --git a/src/or/eventdns.c b/src/or/eventdns.c index 517db58853..0aba4dbfb9 100644 --- a/src/or/eventdns.c +++ b/src/or/eventdns.c @@ -2683,7 +2683,7 @@ resolv_conf_parse_line(char *const start, int flags) { int evdns_resolv_conf_parse(int flags, const char *const filename) { struct stat st; - int fd; + int fd, n, r; u8 *resolv; char *start; int err = 0; @@ -2707,10 +2707,15 @@ evdns_resolv_conf_parse(int flags, const char *const filename) { resolv = (u8 *) malloc((size_t)st.st_size + 1); if (!resolv) { err = 4; goto out1; } - if (read(fd, resolv, (size_t)st.st_size) != st.st_size) { - err = 5; goto out2; + n = 0; + while ((r = read(fd, resolv+n, (size_t)st.st_size-n)) > 0) { + n += r; + if (n == st.st_size) + break; + assert(n < st.st_size); } - resolv[st.st_size] = 0; // we malloced an extra byte + if (r < 0) { err = 5; goto out2; } + resolv[n] = 0; // we malloced an extra byte; this should be fine. start = (char *) resolv; for (;;) { |