From: Andre Noll Date: Sat, 19 Jan 2008 13:41:15 +0000 (+0100) Subject: dccp_send: Fix a fd leak. X-Git-Tag: v0.3.1~77 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=c568930c77d134f09c7a0aa59cb0622ae35fb7cb dccp_send: Fix a fd leak. If shutdown(fd, SHUT_RD) fails, we miss to close the fd. --- 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)