This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.orgHarald Welte has submitted this change and it was merged. Change subject: osmo_stream_srv_fd_cb(): don't leak socket FDs on errors ...................................................................... osmo_stream_srv_fd_cb(): don't leak socket FDs on errors So far we seem to assume that the accept_cb does all handling of socket fd cleanup. However, there are cases where there is no accept_cb set, the accept_cb returns error, or an earlier sctp_sock_activate_events() or the activation of non-blocking mode fails. For those cases, close the socket and return an error code. Fixes: CID#57915 Change-Id: I3a3ce9194ab7ca5c1921fc79c2a1c9e10a552cf0 --- M src/stream.c 1 file changed, 23 insertions(+), 6 deletions(-) Approvals: Harald Welte: Looks good to me, approved Jenkins Builder: Verified diff --git a/src/stream.c b/src/stream.c index 591cd06..653f26b 100644 --- a/src/stream.c +++ b/src/stream.c @@ -529,6 +529,7 @@ static int osmo_stream_srv_fd_cb(struct osmo_fd *ofd, unsigned int what) { int ret; + int sock_fd; struct sockaddr_in sa; socklen_t sa_len = sizeof(sa); struct osmo_stream_srv_link *link = ofd->data; @@ -541,17 +542,33 @@ } LOGP(DLINP, LOGL_DEBUG, "accept()ed new link from %s to port %u\n", inet_ntoa(sa.sin_addr), link->port); + sock_fd = ret; - if (link->proto == IPPROTO_SCTP) - sctp_sock_activate_events(ret); + if (link->proto == IPPROTO_SCTP) { + ret = sctp_sock_activate_events(sock_fd); + if (ret < 0) + goto error_close_socket; + } - if (link->flags & OSMO_STREAM_SRV_F_NODELAY) - setsockopt_nodelay(ret, link->proto, 1); + if (link->flags & OSMO_STREAM_SRV_F_NODELAY) { + ret = setsockopt_nodelay(ret, link->proto, 1); + if (ret < 0) + goto error_close_socket; + } - if (link->accept_cb) - link->accept_cb(link, ret); + if (!link->accept_cb) { + ret = -ENOTSUP; + goto error_close_socket; + } + ret = link->accept_cb(link, sock_fd); + if (ret) + goto error_close_socket; return 0; + +error_close_socket: + close(sock_fd); + return ret; } /*! \brief Create an Osmocom Stream Server Link -- To view, visit https://gerrit.osmocom.org/1320 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: merged Gerrit-Change-Id: I3a3ce9194ab7ca5c1921fc79c2a1c9e10a552cf0 Gerrit-PatchSet: 2 Gerrit-Project: libosmo-netif Gerrit-Branch: master Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de> Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de>