Browse Source

Fix possible bug on threading platforms with running out of fds do to cpuworkers and dnsworkers.

svn:r4008
Nick Mathewson 20 years ago
parent
commit
0fff263a46
2 changed files with 5 additions and 1 deletions
  1. 2 1
      src/or/cpuworker.c
  2. 3 0
      src/or/dns.c

+ 2 - 1
src/or/cpuworker.c

@@ -262,7 +262,7 @@ static int cpuworker_main(void *data) {
       }
       if (write_all(fd, buf, LEN_ONION_RESPONSE, 1) != LEN_ONION_RESPONSE) {
         log_fn(LOG_ERR,"writing response buf failed. Exiting.");
-        spawn_exit();
+        goto end;
       }
       log_fn(LOG_DEBUG,"finished writing response.");
     }
@@ -272,6 +272,7 @@ static int cpuworker_main(void *data) {
     crypto_free_pk_env(onion_key);
   if (last_onion_key)
     crypto_free_pk_env(last_onion_key);
+  close(fd);
   spawn_exit();
   return 0; /* windows wants this function to return an int */
 }

+ 3 - 0
src/or/dns.c

@@ -728,11 +728,13 @@ static int dnsworker_main(void *data) {
         log_fn(LOG_INFO,"DNS worker exiting because of error on connection to Tor process.");
         log_fn(LOG_INFO,"(Error on %d was %s)", fd, tor_socket_strerror(tor_socket_errno(fd)));
       }
+      close(fd);
       spawn_exit();
     }
 
     if (address_len && read_all(fd, address, address_len, 1) != address_len) {
       log_fn(LOG_ERR,"read hostname failed. Child exiting.");
+      close(fd);
       spawn_exit();
     }
     address[address_len] = 0; /* null terminate it */
@@ -759,6 +761,7 @@ static int dnsworker_main(void *data) {
     set_uint32(answer+1, ip);
     if (write_all(fd, answer, 5, 1) != 5) {
       log_fn(LOG_ERR,"writing answer failed. Child exiting.");
+      close(fd);
       spawn_exit();
     }
   }