]> granicus.if.org Git - mutt/commitdiff
Minor resource and error logic cleanup in tunnel_socket_open()
authorKevin McCarthy <kevin@8t8.us>
Mon, 21 Nov 2016 00:19:18 +0000 (16:19 -0800)
committerKevin McCarthy <kevin@8t8.us>
Mon, 21 Nov 2016 00:19:18 +0000 (16:19 -0800)
Free the conn->sockdata on failure.  conn->fd is not set until the
bottom, and before it is set, conn->conn_close() will not be called.

Close the pin pipe if the pout pipe fails.

Call mutt_perror first on a fork failure.  Calling after the close()
may cause errno to be changed on a close failure.

mutt_tunnel.c

index d49626e60c3c608dd6ec5d391e9dbf87f20aaa3a..e199e07bc426ca808632511746cfeca659df9050 100644 (file)
@@ -75,11 +75,15 @@ static int tunnel_socket_open (CONNECTION *conn)
   if ((rc = pipe (pin)) == -1)
   {
     mutt_perror ("pipe");
+    FREE (&conn->sockdata);
     return -1;
   }
   if ((rc = pipe (pout)) == -1)
   {
     mutt_perror ("pipe");
+    close (pin[0]);
+    close (pin[1]);
+    FREE (&conn->sockdata);
     return -1;
   }
 
@@ -109,11 +113,12 @@ static int tunnel_socket_open (CONNECTION *conn)
 
   if (pid == -1)
   {
+    mutt_perror ("fork");
     close (pin[0]);
     close (pin[1]);
     close (pout[0]);
     close (pout[1]);
-    mutt_perror ("fork");
+    FREE (&conn->sockdata);
     return -1;
   }
   if (close (pin[1]) < 0 || close (pout[0]) < 0)