| 
					
				 | 
			
			
				@@ -3264,8 +3264,11 @@ format_hex_number_for_helper_exit_status(unsigned int x, char *buf, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * in the processs of starting the child process did the failure occur (see 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * CHILD_STATE_* macros for definition), and SAVED_ERRNO is the value of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * errno when the failure occurred. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * On success return the number of characters added to hex_errno, not counting 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * the terminating NUL; return -1 on error. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 format_helper_exit_status(unsigned char child_state, int saved_errno, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                           char *hex_errno) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3273,6 +3276,7 @@ format_helper_exit_status(unsigned char child_state, int saved_errno, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int written, left; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   char *cur; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   size_t i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  int res = -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* Fill hex_errno with spaces, and a trailing newline (memset may 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      not be signal handler safe, so we can't use it) */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3343,6 +3347,8 @@ format_helper_exit_status(unsigned char child_state, int saved_errno, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   *cur++ = '\n'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   *cur++ = '\0'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  res = cur - hex_errno - 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   goto done; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  err: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3353,7 +3359,7 @@ format_helper_exit_status(unsigned char child_state, int saved_errno, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   *hex_errno = '\0'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  done: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* Maximum number of file descriptors, if we cannot get it via sysconf() */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -3695,15 +3701,20 @@ tor_spawn_background(const char *const filename, const char **argv, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     child_state = CHILD_STATE_FAILEXEC; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   error: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /* XXX: are we leaking fds from the pipe? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      /* XXX: are we leaking fds from the pipe? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      int n; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    format_helper_exit_status(child_state, errno, hex_errno); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      n = format_helper_exit_status(child_state, errno, hex_errno); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /* Write the error message. GCC requires that we check the return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       value, but there is nothing we can do if it fails */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /* TODO: Don't use STDOUT, use a pipe set up just for this purpose */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    nbytes = write(STDOUT_FILENO, error_message, error_message_length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    nbytes = write(STDOUT_FILENO, hex_errno, sizeof(hex_errno)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (n >= 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /* Write the error message. GCC requires that we check the return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           value, but there is nothing we can do if it fails */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /* TODO: Don't use STDOUT, use a pipe set up just for this purpose */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        nbytes = write(STDOUT_FILENO, error_message, error_message_length); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        nbytes = write(STDOUT_FILENO, hex_errno, n); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (void) nbytes; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |