[sr-dev] git:master: tcp: fix fd leak on async error or quick connect

Andrei Pelinescu-Onciul andrei at iptel.org
Fri Sep 18 21:06:34 CEST 2009


Module: sip-router
Branch: master
Commit: b8d528b657bd52fce0b342e01380001b4ffa15fe
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b8d528b657bd52fce0b342e01380001b4ffa15fe

Author: Andrei Pelinescu-Onciul <andrei at iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei at iptel.org>
Date:   Fri Sep 18 20:52:37 2009 +0200

tcp: fix fd leak on async error or quick connect

In some error cases (from which the most likely to appear in
real-life would be maximum global send queue size exceeded),
the fd for a new created connection (in tcp_send()) was not closed
when the connection was destroyed.
Same thing happened in the case of a "quick" connect (connect & send
finish immediately, this happens in general only on localhost) for
a connection marked as close-after-send (via the new msg
send_flags).

---

 tcp_main.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/tcp_main.c b/tcp_main.c
index a72e3cc..d2f7b59 100644
--- a/tcp_main.c
+++ b/tcp_main.c
@@ -2270,6 +2270,9 @@ conn_wait_close:
 	 * connection (tcpconn_chld_put(c))) or when tcp_main receives a
 	 * CONN_ERROR it*/
 	c->state=S_CONN_BAD;
+	/* we are here only if we opened a new fd (and not reused a cached or
+	   a reader one) => if the connect was successful close the fd */
+	if (fd>=0) close(fd);
 	TCPCONN_LOCK;
 		if (c->flags & F_CONN_HASHED){
 			/* if some other parallel tcp_send did send CONN_ERROR to




More information about the sr-dev mailing list