> 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 dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev