Fixed FD leak on accept-timeout with retry

This commit is contained in:
Gerhard Rieger 2022-12-30 11:59:46 +01:00
parent 67027cee59
commit 486bb2c65c
2 changed files with 8 additions and 0 deletions

View file

@ -13,6 +13,9 @@ Corrections:
SOCKET-LISTEN:1:1:'"/tmp/sock"'
Test: DALAN_NO_SIGSEGV
The retry option with some address types (TCP) did not close() the
sockets after failed attempts, resulting in an FD leak.
Coding:
New Environment variable SOCAT_TRANSFER_WAIT that Socat sleep before
starting the data transfer loop. Useful, e.g., to accumulate multiple

View file

@ -826,12 +826,14 @@ int _xioopen_connect(struct single *xfd, union sockaddr_union *us, size_t uslen,
if (result < 0) {
Msg4(level, "xiopoll({%d,POLLOUT|POLLERR},,{"F_tv_sec"."F_tv_usec"): %s",
xfd->fd, timeout.tv_sec, timeout.tv_usec, strerror(errno));
Close(xfd->fd);
return STAT_RETRYLATER;
}
if (result == 0) {
Msg2(level, "connecting to %s: %s",
sockaddr_info(them, themlen, infobuff, sizeof(infobuff)),
strerror(ETIMEDOUT));
Close(xfd->fd);
return STAT_RETRYLATER;
}
if (writefd.revents & POLLERR) {
@ -847,6 +849,7 @@ int _xioopen_connect(struct single *xfd, union sockaddr_union *us, size_t uslen,
xfd->fd, sockaddr_info(them, themlen, infobuff, sizeof(infobuff)),
themlen, strerror(errno));
#endif
Close(xfd->fd);
return STAT_RETRYLATER;
}
/* otherwise OK or network error */
@ -854,6 +857,7 @@ int _xioopen_connect(struct single *xfd, union sockaddr_union *us, size_t uslen,
if (result != 0) {
Msg2(level, "getsockopt(%d, SOL_SOCKET, SO_ERROR, ...): %s",
xfd->fd, strerror(err));
Close(xfd->fd);
return STAT_RETRYLATER;
}
Debug2("getsockopt(%d, SOL_SOCKET, SO_ERROR, { %d }) -> 0",
@ -862,6 +866,7 @@ int _xioopen_connect(struct single *xfd, union sockaddr_union *us, size_t uslen,
Msg4(level, "connect(%d, %s, "F_Zd"): %s",
xfd->fd, sockaddr_info(them, themlen, infobuff, sizeof(infobuff)),
themlen, strerror(err));
Close(xfd->fd);
return STAT_RETRYLATER;
}
Fcntl_l(xfd->fd, F_SETFL, fcntl_flags);