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
This commit is contained in:
Nick Mathewson 2007-05-22 01:39:31 +00:00
parent 993c497325
commit 1837b5670f
3 changed files with 15 additions and 7 deletions

View File

@ -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,

View File

@ -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) {

View File

@ -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 (;;) {