diff --git a/include/mumlib.hpp b/include/mumlib.hpp index 992321c..5df4f50 100644 --- a/include/mumlib.hpp +++ b/include/mumlib.hpp @@ -41,7 +41,7 @@ namespace mumlib { void sendTextMessage(std::string message); - void joinChannel(int channel_id); + void joinChannel(int channelId); private: _Mumlib_Private *impl; diff --git a/include/mumlib/Callback.hpp b/include/mumlib/Callback.hpp index 7ff4aa6..a11b7b4 100644 --- a/include/mumlib/Callback.hpp +++ b/include/mumlib/Callback.hpp @@ -179,7 +179,7 @@ namespace mumlib { string welcome_text, int32_t session, int32_t max_bandwidth, - int64_t permissions); + int64_t permissions) override; virtual void channelRemove(uint32_t channel_id) override; diff --git a/include/mumlib/Transport.hpp b/include/mumlib/Transport.hpp index 433106f..ccf94a7 100644 --- a/include/mumlib/Transport.hpp +++ b/include/mumlib/Transport.hpp @@ -18,7 +18,7 @@ namespace mumlib { constexpr int MAX_UDP_LENGTH = 1024; - constexpr int MAX_TCP_LENGTH = 2048; + constexpr int MAX_TCP_LENGTH = 129 * 1024; // 128 kB + some reserve using namespace std; using namespace boost::asio; @@ -85,8 +85,7 @@ namespace mumlib { ssl::context sslContext; ssl::stream sslSocket; - uint8_t sslIncomingBuffer[MAX_TCP_LENGTH]; - + uint8_t *sslIncomingBuffer; deadline_timer pingTimer; std::chrono::time_point lastReceivedUdpPacketTimestamp; diff --git a/src/Transport.cpp b/src/Transport.cpp index a65bf28..f134512 100644 --- a/src/Transport.cpp +++ b/src/Transport.cpp @@ -42,11 +42,14 @@ mumlib::Transport::Transport( pingTimer(ioService, PING_INTERVAL), asyncBufferPool(max(MAX_UDP_LENGTH, MAX_TCP_LENGTH)) { + sslIncomingBuffer = new uint8_t[MAX_TCP_LENGTH]; + pingTimer.async_wait(boost::bind(&Transport::pingTimerTick, this, _1)); } mumlib::Transport::~Transport() { disconnect(); + delete[] sslIncomingBuffer; } void mumlib::Transport::connect( @@ -292,9 +295,16 @@ void mumlib::Transport::doReceiveSsl() { } const int payloadSize = ntohl(*reinterpret_cast(sslIncomingBuffer + 2)); - size_t remaining = payloadSize + 6 - bytesTransferred; + const int wholeMessageLength = payloadSize + 6; + size_t remaining = wholeMessageLength - bytesTransferred; remaining = max(remaining, (size_t) 0); + if (wholeMessageLength > MAX_TCP_LENGTH) { + throwTransportException( + (boost::format("message bigger (%d B) than max allowed size (%d B)") + % wholeMessageLength % MAX_TCP_LENGTH).str()); + } + return remaining; }, [this](const boost::system::error_code &ec, size_t bytesTransferred) { @@ -314,7 +324,8 @@ void mumlib::Transport::doReceiveSsl() { } else { logger.error("SSL receiver error: %s. Bytes transferred: %d.", ec.message().c_str(), bytesTransferred); - throwTransportException("receive failed: " + ec.message()); + //todo temporarily disable exception throwing until issue #6 is solved + //throwTransportException("receive failed: " + ec.message()); } }); } diff --git a/src/mumlib.cpp b/src/mumlib.cpp index 7bd325f..a5dbb3a 100644 --- a/src/mumlib.cpp +++ b/src/mumlib.cpp @@ -386,9 +386,10 @@ namespace mumlib { impl->transport.sendControlMessage(MessageType::TEXTMESSAGE, textMessage); } - void Mumlib::joinChannel(int channel_id) { + void Mumlib::joinChannel(int channelId) { MumbleProto::UserState userState; - userState.set_channel_id(channel_id); + userState.set_channel_id(channelId); impl->transport.sendControlMessage(MessageType::USERSTATE, userState); + impl->channelId = channelId; } }