> I agree that this fixes a problem, but the exit path in this function
> is hard to understand. How about this instead:
Good idea, I took your diff and tweaked it a bit to come up with the following.
---
lib/socket-util.c | 15 ++++-----------
1 file changed, 4 insertions(+), 11 deletions(-)
diff --git a/lib/socket-util.c b/lib/socket-util.c
index 6554e97..aded01c 100644
--- a/lib/socket-util.c
+++ b/lib/socket-util.c
@@ -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;
}
--
1.7.9.6
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev