From: Ben Pfaff Date: Tue, 6 Dec 2011 23:55:22 +0000 (-0800) Subject: socket-util: Correctly return negative values for errors. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ca286ba95be3c0815e5f9c4df54dbed7f5e2d4e7;p=openvswitch socket-util: Correctly return negative values for errors. 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. --- diff --git a/lib/socket-util.c b/lib/socket-util.c index 26e29081..219433fb 100644 --- a/lib/socket-util.c +++ b/lib/socket-util.c @@ -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