From 7c8e59a917a055595d858c54318b3f79db178334 Mon Sep 17 00:00:00 2001 From: thomas Date: Mon, 24 Jul 2006 17:50:54 +0000 Subject: [PATCH] Now preventing fd leaks. Fix kindly provided by Artur Skawina: http://www.linuxtv.org/pipermail/vdr/2006-May/009342.html Closing bug: http://www.vdr-developer.org/mantisbt/view.php?id=115 --- tools/socket.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/tools/socket.c b/tools/socket.c index 3e3be65..4b5167d 100644 --- a/tools/socket.c +++ b/tools/socket.c @@ -29,23 +29,31 @@ bool cTBSocket::Connect(const std::string &Host, unsigned int Port) { m_LocalAddr.sin_port = 0; m_LocalAddr.sin_addr.s_addr = INADDR_ANY; if (::bind(socket, (struct sockaddr*)&m_LocalAddr, sizeof(m_LocalAddr)) - == -1) + == -1) { + ::close(socket); return false; + } 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) + sizeof(m_RemoteAddr)) == -1) { + ::close(socket); return false; + } len = sizeof(struct sockaddr_in); - if (::getpeername(socket, (struct sockaddr*)&m_RemoteAddr, &len) == -1) + if (::getpeername(socket, (struct sockaddr*)&m_RemoteAddr, &len) == -1) { + ::close(socket); return false; + } len = sizeof(struct sockaddr_in); - if (::getsockname(socket, (struct sockaddr*)&m_LocalAddr, &len) == -1) + if (::getsockname(socket, (struct sockaddr*)&m_LocalAddr, &len) == -1) { + ::close(socket); return false; + } return cTBSource::Open(socket); }