From patchwork Fri May 5 19:21:43 2006 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Artur Skawina X-Patchwork-Id: 12301 Received: from dkw171.neoplus.adsl.tpnet.pl ([83.24.26.171] helo=unknown.box) by www.linuxtv.org with smtp (Exim 4.50) id 1Fc5sT-0003kF-Tc for vdr@linuxtv.org; Fri, 05 May 2006 21:22:14 +0200 Received: (qmail 8398 invoked from network); 5 May 2006 19:21:43 -0000 Received: from unknown (HELO ?172.19.43.221?) (172.19.43.221) by 172.19.43.250 with SMTP; 5 May 2006 19:21:43 -0000 Message-ID: <445BA5C7.7080600@o2.pl> Date: Fri, 05 May 2006 21:21:43 +0200 From: Artur Skawina User-Agent: Mail/News 3.0a1 (X11/20060416) MIME-Version: 1.0 To: VDR Mailing List Cc: Sascha Volkenandt Subject: [vdr] [PATCH] streamdev-plugin - client fd leak fix X-BeenThere: vdr@linuxtv.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: VDR Mailing List List-Id: VDR Mailing List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 05 May 2006 19:22:14 -0000 Status: O X-Status: X-Keywords: X-UID: 9344 when a streamdev server is not accepting connections (eg isn't running) the client leaks fds. Spotted this after it leaked ~1000 fds and prevented vdr from opening any files... fix below. artur diff -urNp /pub/cvs/vdr/streamdev/streamdev/tools/socket.c streamdev/tools/socket.c --- /pub/cvs/vdr/streamdev/streamdev/tools/socket.c 2005-02-08 17:22:35.000000000 +0000 +++ streamdev/tools/socket.c 2006-02-24 01:43:29.000000000 +0000 @@ -30,24 +31,27 @@ bool cTBSocket::Connect(const std::strin m_LocalAddr.sin_addr.s_addr = INADDR_ANY; if (::bind(socket, (struct sockaddr*)&m_LocalAddr, sizeof(m_LocalAddr)) == -1) - return false; + goto closefd; m_RemoteAddr.sin_family = AF_INET; m_RemoteAddr.sin_port = htons(Port); m_RemoteAddr.sin_addr.s_addr = inet_addr(Host.c_str()); if (::connect(socket, (struct sockaddr*)&m_RemoteAddr, sizeof(m_RemoteAddr)) == -1) - return false; + goto closefd; len = sizeof(struct sockaddr_in); if (::getpeername(socket, (struct sockaddr*)&m_RemoteAddr, &len) == -1) - return false; + goto closefd; len = sizeof(struct sockaddr_in); if (::getsockname(socket, (struct sockaddr*)&m_LocalAddr, &len) == -1) - return false; + goto closefd; return cTBSource::Open(socket); +closefd: + ::close(socket); + return false; } bool cTBSocket::Listen(const std::string &Ip, unsigned int Port, int BackLog) {