diff --git a/changelog.md b/changelog.md index b5ad4a1..6483241 100644 --- a/changelog.md +++ b/changelog.md @@ -49,6 +49,10 @@ HEAD heretic13 for reporting - Bug: Fix uninitialized shared pointer in Asio transport test suite. #647 Thank you Alex Korotkin for reporting and a patch. +- Bug: Fix a thread safety issue in the permessage-deflate extension that + caused message corruption when sending compressed messages from a different + thread than the main I/O thread. #615 Thank you KyleNyenhuis and Pieter De + Gendt for reporting and a patch. 0.7.0 - 2016-02-22 - MINOR BREAKING SOCKET POLICY CHANGE: Asio transport socket policy method diff --git a/websocketpp/extensions/permessage_deflate/enabled.hpp b/websocketpp/extensions/permessage_deflate/enabled.hpp index 563b954..d05403a 100644 --- a/websocketpp/extensions/permessage_deflate/enabled.hpp +++ b/websocketpp/extensions/permessage_deflate/enabled.hpp @@ -226,7 +226,7 @@ public: , m_server_max_window_bits_mode(mode::accept) , m_client_max_window_bits_mode(mode::accept) , m_initialized(false) - , m_compress_buffer_size(16384) + , m_compress_buffer_size(8192) { m_dstate.zalloc = Z_NULL; m_dstate.zfree = Z_NULL; @@ -305,6 +305,7 @@ public: } m_compress_buffer.reset(new unsigned char[m_compress_buffer_size]); + m_decompress_buffer.reset(new unsigned char[m_compress_buffer_size]); if ((m_server_no_context_takeover && is_server) || (m_client_no_context_takeover && !is_server)) { @@ -596,7 +597,7 @@ public: do { m_istate.avail_out = m_compress_buffer_size; - m_istate.next_out = m_compress_buffer.get(); + m_istate.next_out = m_decompress_buffer.get(); ret = inflate(&m_istate, Z_SYNC_FLUSH); @@ -605,7 +606,7 @@ public: } out.append( - reinterpret_cast(m_compress_buffer.get()), + reinterpret_cast(m_decompress_buffer.get()), m_compress_buffer_size - m_istate.avail_out ); } while (m_istate.avail_out == 0); @@ -804,6 +805,7 @@ private: int m_flush; size_t m_compress_buffer_size; lib::unique_ptr_uchar_array m_compress_buffer; + lib::unique_ptr_uchar_array m_decompress_buffer; z_stream m_dstate; z_stream m_istate; };