|  | @@ -25,6 +25,7 @@ static int nfds=0; /* number of connections currently active */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static int please_dumpstats=0; /* whether we should dump stats during the loop */
 | 
	
		
			
				|  |  |  static int please_fetch_directory=0; /* whether we should fetch a new directory */
 | 
	
		
			
				|  |  | +static int please_reap_children=0; /* whether we should waitpid for exited children*/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* private key */
 | 
	
		
			
				|  |  |  static crypto_pk_env_t *privatekey=NULL;
 | 
	
	
		
			
				|  | @@ -527,6 +528,10 @@ static int do_main_loop(void) {
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        please_fetch_directory = 0;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    if(please_reap_children) {
 | 
	
		
			
				|  |  | +      while(waitpid(-1,NULL,WNOHANG)) ; /* keep reaping until no more zombies */
 | 
	
		
			
				|  |  | +      please_reap_children = 0;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      if(prepare_for_poll(&timeout) < 0) {
 | 
	
		
			
				|  |  |        log(LOG_DEBUG,"do_main_loop(): prepare_for_poll failed, exiting.");
 | 
	
		
			
				|  |  |        return -1;
 | 
	
	
		
			
				|  | @@ -591,6 +596,8 @@ static void catch(int the_signal) {
 | 
	
		
			
				|  |  |      case SIGUSR1:
 | 
	
		
			
				|  |  |        please_dumpstats = 1;
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  | +    case SIGCHLD:
 | 
	
		
			
				|  |  | +      please_reap_children = 1;
 | 
	
		
			
				|  |  |      default:
 | 
	
		
			
				|  |  |        log(LOG_ERR,"Caught signal that we can't handle??");
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -845,6 +852,7 @@ int tor_main(int argc, char *argv[]) {
 | 
	
		
			
				|  |  |    signal (SIGTERM, catch);
 | 
	
		
			
				|  |  |    signal (SIGUSR1, catch); /* to dump stats to stdout */
 | 
	
		
			
				|  |  |    signal (SIGHUP,  catch); /* to reload directory */
 | 
	
		
			
				|  |  | +  signal (SIGCHLD, catch); /* for exiting dns/cpu workers */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    crypto_global_init();
 | 
	
		
			
				|  |  |    crypto_seed_rng();
 |