From c568930c77d134f09c7a0aa59cb0622ae35fb7cb Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 19 Jan 2008 14:41:15 +0100 Subject: [PATCH] dccp_send: Fix a fd leak. If shutdown(fd, SHUT_RD) fails, we miss to close the fd. --- dccp_send.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/dccp_send.c b/dccp_send.c index 9de618b2..02e60f44 100644 --- a/dccp_send.c +++ b/dccp_send.c @@ -63,7 +63,7 @@ static void dccp_pre_select( int *max_fileno, fd_set *rfds, static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) { struct dccp_client *dc; - int ret; + int ret, fd; if (listen_fd < 0 || !FD_ISSET(listen_fd, rfds)) return; @@ -72,14 +72,15 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) PARA_ERROR_LOG("%s\n", para_strerror(-ret)); return; } + fd = ret; /* * Bypass unused CCID paths: the sender does not receive application data * from the client; by shutting down this unused communication path we can * reduce processing costs a bit. See analogous comment in dccp_recv.c. */ - if (shutdown(ret, SHUT_RD) < 0) { + if (shutdown(fd, SHUT_RD) < 0) { PARA_ERROR_LOG("shutdown(SHUT_RD): %s\n", strerror(errno)); - return; + goto err; } dc = para_calloc(sizeof(struct dccp_client)); dc->fd = ret; @@ -89,6 +90,9 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds) add_close_on_fork_list(dc->fd); mark_fd_nonblocking(dc->fd); dc->cq = cq_new(DCCP_MAX_PENDING_BYTES); + return; +err: + close(fd); } static int dccp_open(void) -- 2.30.2