]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Fix a symptom for a bug that straycat found.
authorRoger Dingledine <arma@torproject.org>
Wed, 25 Aug 2004 05:26:09 +0000 (05:26 +0000)
committerRoger Dingledine <arma@torproject.org>
Wed, 25 Aug 2004 05:26:09 +0000 (05:26 +0000)
Apparently in rare cases poll() is returning POLLIN for an idle
dns worker. It reads no bytes, presumably because the idle dns
worker didn't write anything in the first place. Gosh, who knows.

Now we only trigger the assert if the idle dns worker actually
tries to send an answer to us.

svn:r2311

src/or/dns.c

index 6cbecc02b98fb166d38af054e278dc979dc14424..a3244ad0b36e3a7940332e7974b5e7e48c87153f 100644 (file)
@@ -568,9 +568,13 @@ int connection_dns_process_inbuf(connection_t *conn) {
     return 0;
   }
 
-  tor_assert(conn->state == DNSWORKER_STATE_BUSY);
+  if(conn->state != DNSWORKER_STATE_BUSY) {
+    log_fn(LOG_WARN,"Bug: poll() indicated than an idle dns worker was readable. Please report.");
+    return 0;
+  }
   if(buf_datalen(conn->inbuf) < 5) /* entire answer available? */
     return 0; /* not yet */
+  tor_assert(conn->state == DNSWORKER_STATE_BUSY);
   tor_assert(buf_datalen(conn->inbuf) == 5);
 
   connection_fetch_from_buf(&success,1,conn);
@@ -646,7 +650,7 @@ static int dnsworker_main(void *data) {
   for(;;) {
 
     if(recv(fd, &address_len, 1, 0) != 1) {
-      log_fn(LOG_INFO,"dnsworker exiting because tor process died.");
+      log_fn(LOG_INFO,"dnsworker exiting because tor process closed connection (either pruned idle dnsworker or died).");
       spawn_exit();
     }