]> granicus.if.org Git - icinga2/commitdiff
Fix memory leak for JSON-RPC/HTTP connections
authorGunnar Beutner <gunnar@beutner.name>
Sun, 8 Nov 2015 20:23:04 +0000 (21:23 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Mon, 9 Nov 2015 09:22:52 +0000 (10:22 +0100)
fixes #10517

lib/base/fifo.hpp
lib/base/networkstream.cpp
lib/base/stdiostream.cpp
lib/base/stream.cpp
lib/base/stream.hpp
lib/base/tlsstream.cpp

index db552c4b3d76f5e87cb98dd773e66b2fe1deb2cb..60a3e4c629dddd5a4a598734999ad4eabf562f53 100644 (file)
@@ -36,7 +36,7 @@ class I2_BASE_API FIFO : public Stream
 public:
        DECLARE_PTR_TYPEDEFS(FIFO);
 
-       static const size_t BlockSize = 16 * 1024;
+       static const size_t BlockSize = 512;
 
        FIFO(void);
        ~FIFO(void);
index b732a02d2b7d4e6f333ffc03519377b3c0ad371f..47b0fd1c24198191d1deef1342c7038fc23dd386 100644 (file)
@@ -27,6 +27,8 @@ NetworkStream::NetworkStream(const Socket::Ptr& socket)
 
 void NetworkStream::Close(void)
 {
+       Stream::Close();
+
        m_Socket->Close();
 }
 
index 356e64361c6ef76b9177a04bc614f1988f50c037..f178aee758d118292565c1ca409cd1ec8aeea0f3 100644 (file)
@@ -55,6 +55,8 @@ void StdioStream::Write(const void *buffer, size_t size)
 
 void StdioStream::Close(void)
 {
+       Stream::Close();
+
        if (m_OwnsStream) {
                delete m_InnerStream;
                m_OwnsStream = false;
index cfcdf0bb05a86d8a90e49101aa2d2dab75e05a84..f14b7a6641b0b4cccf5923846a2c91162dd24ff2 100644 (file)
@@ -76,6 +76,11 @@ bool Stream::WaitForData(int timeout)
        return IsDataAvailable() || IsEof();
 }
 
+void Stream::Close(void)
+{
+       OnDataAvailable.disconnect_all_slots();
+}
+
 StreamReadStatus Stream::ReadLine(String *line, StreamReadContext& context, bool may_wait)
 {
        if (context.Eof)
index 32ed4bb8d0b3b1e176d634e14715572c746be23e..7928a51e6864154a41a63a3c450781f0ec701389 100644 (file)
@@ -113,7 +113,7 @@ public:
        /**
         * Closes the stream and releases resources.
         */
-       virtual void Close(void) = 0;
+       virtual void Close(void);
 
        /**
         * Checks whether we've reached the end-of-file condition.
index d68d82fedd20a21394279b16457c1fa4a5b09880..eba8375f5eabb2c577c8360824cbee12f4a99cc6 100644 (file)
@@ -85,7 +85,7 @@ TlsStream::TlsStream(const Socket::Ptr& socket, const String& hostname, Connecti
 
 TlsStream::~TlsStream(void)
 {
-       SocketEvents::Unregister();
+       Close();
 }
 
 int TlsStream::ValidateCertificate(int preverify_ok, X509_STORE_CTX *ctx)
@@ -216,33 +216,31 @@ void TlsStream::OnEvent(int revents)
 
                        break;
                case SSL_ERROR_ZERO_RETURN:
-                       SocketEvents::Unregister();
-
-                       m_SSL.reset();
-                       m_Socket->Close();
-                       m_Socket.reset();
+                       lock.unlock();
 
-                       m_Eof = true;
+                       if (IsHandlingEvents())
+                               SignalDataAvailable();
 
-                       m_CV.notify_all();
+                       Close();
 
                        break;
                default:
-                       SocketEvents::Unregister();
-
-                       m_SSL.reset();
-                       m_Socket->Close();
-                       m_Socket.reset();
-
-                       m_Eof = true;
-
                        m_ErrorCode = ERR_peek_error();
                        m_ErrorOccurred = true;
 
-                       Log(LogWarning, "TlsStream")
-                           << "OpenSSL error: " << ERR_error_string(m_ErrorCode, NULL);
+                       if (m_ErrorCode != 0) {
+                               Log(LogWarning, "TlsStream")
+                                       << "OpenSSL error: " << ERR_error_string(m_ErrorCode, NULL);
+                       } else {
+                               Log(LogWarning, "TlsStream", "TLS stream was disconnected.");
+                       }
+
+                       lock.unlock();
+
+                       if (IsHandlingEvents())
+                               SignalDataAvailable();
 
-                       m_CV.notify_all();
+                       Close();
 
                        break;
        }
@@ -318,6 +316,8 @@ void TlsStream::Shutdown(void)
  */
 void TlsStream::Close(void)
 {
+       Stream::Close();
+
        SocketEvents::Unregister();
 
        boost::mutex::scoped_lock lock(m_Mutex);
@@ -327,11 +327,13 @@ void TlsStream::Close(void)
        if (!m_SSL)
                return;
 
-       (void) SSL_shutdown(m_SSL.get());
+       (void)SSL_shutdown(m_SSL.get());
        m_SSL.reset();
 
        m_Socket->Close();
        m_Socket.reset();
+
+       m_CV.notify_all();
 }
 
 bool TlsStream::IsEof(void) const