socket-util: Correctly return negative values for errors.
authorBen Pfaff <blp@nicira.com>
Tue, 6 Dec 2011 23:55:22 +0000 (15:55 -0800)
committerBen Pfaff <blp@nicira.com>
Wed, 7 Dec 2011 16:38:16 +0000 (08:38 -0800)
The comment on this function says that negative values indicate errors, and
the callers assume that too, but in fact it was returning positive errno
values, which are indistinguishable from valid fd numbers.

It really seems to me that this should have been found pretty quickly in
the field, since stream-tcp and stream-ssl both use inet_open_passive to
implement their passive listeners.  I'm surprised that no one has reported
it.

lib/socket-util.c

index 26e290815cbf2e4856a53ca7fa33016453bdc818..219433fb8f4968b0d6260223fe92af6a10c84399 100644 (file)
@@ -673,7 +673,7 @@ inet_open_passive(int style, const char *target, int default_port,
     unsigned int yes = 1;
 
     if (!inet_parse_passive(target, default_port, &sin)) {
-        return EAFNOSUPPORT;
+        return -EAFNOSUPPORT;
     }
 
     /* Create non-blocking socket, set SO_REUSEADDR. */
@@ -681,7 +681,7 @@ inet_open_passive(int style, const char *target, int default_port,
     if (fd < 0) {
         error = errno;
         VLOG_ERR("%s: socket: %s", target, strerror(error));
-        return error;
+        return -error;
     }
     error = set_nonblocking(fd);
     if (error) {
@@ -716,6 +716,7 @@ inet_open_passive(int style, const char *target, int default_port,
             goto error;
         }
         if (sin.sin_family != AF_INET || sin_len != sizeof sin) {
+            error = EAFNOSUPPORT;
             VLOG_ERR("%s: getsockname: invalid socket name", target);
             goto error;
         }
@@ -726,7 +727,7 @@ inet_open_passive(int style, const char *target, int default_port,
 
 error:
     close(fd);
-    return error;
+    return -error;
 }
 
 /* Returns a readable and writable fd for /dev/null, if successful, otherwise