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

[or-cvs] r10237: Bugfix and possible backport candidate: use the same logic a (in tor/trunk: . src/or)



Author: nickm
Date: 2007-05-21 17:48:02 -0400 (Mon, 21 May 2007)
New Revision: 10237

Modified:
   tor/trunk/
   tor/trunk/ChangeLog
   tor/trunk/src/or/dns.c
   tor/trunk/src/or/eventdns.c
Log:
 r13025@Kushana:  nickm | 2007-05-21 17:40:56 -0400
 Bugfix and possible backport candidate: use the same logic as in read_all when reading resolv.conf.  Maybe this fixes bug 433.



Property changes on: tor/trunk
___________________________________________________________________
 svk:merge ticket from /tor/trunk [r13025] on c95137ef-5f19-0410-b913-86e773d04f59

Modified: tor/trunk/ChangeLog
===================================================================
--- tor/trunk/ChangeLog	2007-05-21 13:48:55 UTC (rev 10236)
+++ tor/trunk/ChangeLog	2007-05-21 21:48:02 UTC (rev 10237)
@@ -131,6 +131,8 @@
       try to use \ consistently on Windows and / consistently on Unix: it
       makes the log messages nicer.
     - Correctly report platform name on Windows 95 OSR2 and Windows 98 SE.
+    - Read resolv.conf files correctly on platforms where read() returns
+      partial results on small file reads.
 
   o Minor bugfixes (directory):
     - Correctly enforce that elements of directory objects do not appear

Modified: tor/trunk/src/or/dns.c
===================================================================
--- tor/trunk/src/or/dns.c	2007-05-21 13:48:55 UTC (rev 10236)
+++ tor/trunk/src/or/dns.c	2007-05-21 21:48:02 UTC (rev 10237)
@@ -1054,6 +1054,7 @@
   or_options_t *options;
   const char *conf_fname;
   struct stat st;
+  int r;
   options = get_options();
   conf_fname = options->ServerDNSResolvConfFile;
 #ifndef MS_WINDOWS
@@ -1078,9 +1079,9 @@
       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) {

Modified: tor/trunk/src/or/eventdns.c
===================================================================
--- tor/trunk/src/or/eventdns.c	2007-05-21 13:48:55 UTC (rev 10236)
+++ tor/trunk/src/or/eventdns.c	2007-05-21 21:48:02 UTC (rev 10237)
@@ -2691,7 +2691,7 @@
 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;
@@ -2715,10 +2715,15 @@
 	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 (;;) {