socket-util: Close socket on failed dscp modification.
authorEthan Jackson <ethan@nicira.com>
Mon, 16 Apr 2012 19:46:46 +0000 (12:46 -0700)
committerEthan Jackson <ethan@nicira.com>
Tue, 17 Apr 2012 20:03:06 +0000 (13:03 -0700)
If socket-util failed to modify the dscp bits of an active
connection, it would fail to close the file descriptor potentially
causing a leak. Found by inspection.

Signed-off-by: Ethan Jackson <ethan@nicira.com>
lib/socket-util.c

index 6554e972192b47a6310123345312d705f701e9f1..aded01c35855acf760c820af5cd91f5a769c0324 100644 (file)
@@ -571,7 +571,7 @@ inet_open_active(int style, const char *target, uint16_t default_port,
     }
     error = set_nonblocking(fd);
     if (error) {
-        goto exit_close;
+        goto exit;
     }
 
     /* The socket options set here ensure that the TOS bits are set during
@@ -589,24 +589,17 @@ inet_open_active(int style, const char *target, uint16_t default_port,
     error = connect(fd, (struct sockaddr *) &sin, sizeof sin) == 0 ? 0 : errno;
     if (error == EINPROGRESS) {
         error = EAGAIN;
-    } else if (error && error != EAGAIN) {
-        goto exit_close;
     }
 
-    /* Success: error is 0 or EAGAIN. */
-    goto exit;
-
-exit_close:
-    close(fd);
 exit:
     if (!error || error == EAGAIN) {
         if (sinp) {
             *sinp = sin;
         }
-        *fdp = fd;
-    } else {
-        *fdp = -1;
+    } else if (fd >= 0) {
+        close(fd);
     }
+    *fdp = fd;
     return error;
 }