From 11a6ff43ae33448eadee3717f24bd3e796f77352 Mon Sep 17 00:00:00 2001 From: Scott Porter Date: Sun, 1 Mar 2020 06:37:06 -0800 Subject: [PATCH] fix: multiple memory leaks and segfault issues in Flatbuffer Forwarder. (#709) --- dependencies/external/flatbuffers | 2 +- libsrc/flatbufserver/FlatBufferClient.cpp | 11 +++++++++-- libsrc/flatbufserver/FlatBufferConnection.cpp | 6 ++++-- libsrc/hyperion/MessageForwarder.cpp | 6 +++--- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/dependencies/external/flatbuffers b/dependencies/external/flatbuffers index 2d5315ff..8c02d17b 160000 --- a/dependencies/external/flatbuffers +++ b/dependencies/external/flatbuffers @@ -1 +1 @@ -Subproject commit 2d5315ff0eebfa4b9c967e708c24be0b21d921b6 +Subproject commit 8c02d17bea5def5b7006a7290a9f111433d0ab19 diff --git a/libsrc/flatbufserver/FlatBufferClient.cpp b/libsrc/flatbufserver/FlatBufferClient.cpp index a20898f6..7816e01b 100644 --- a/libsrc/flatbufserver/FlatBufferClient.cpp +++ b/libsrc/flatbufserver/FlatBufferClient.cpp @@ -44,7 +44,7 @@ void FlatBufferClient::readyRead() if((uint32_t) _receiveBuffer.size() < messageSize + 4) return; // extract message only and remove header + msg from buffer :: QByteArray::remove() does not return the removed data - const QByteArray msg = _receiveBuffer.right(messageSize); + const QByteArray msg = _receiveBuffer.mid(4, messageSize); _receiveBuffer.remove(0, messageSize + 4); const auto* msgData = reinterpret_cast(msg.constData()); @@ -113,6 +113,8 @@ void FlatBufferClient::registationRequired(const int priority) // send reply sendMessage(); + + _builder.Clear(); } } @@ -133,6 +135,8 @@ void FlatBufferClient::handleRegisterCommand(const hyperionnet::Register *regReq // send reply sendMessage(); + + _builder.Clear(); } void FlatBufferClient::handleImageCommand(const hyperionnet::Image *image) @@ -192,7 +196,6 @@ void FlatBufferClient::sendMessage() _socket->write((const char *) sizeData, sizeof(sizeData)); _socket->write((const char *)buffer, size); _socket->flush(); - _builder.Clear(); } void FlatBufferClient::sendSuccessReply() @@ -202,6 +205,8 @@ void FlatBufferClient::sendSuccessReply() // send reply sendMessage(); + + _builder.Clear(); } void FlatBufferClient::sendErrorReply(const std::string &error) @@ -212,4 +217,6 @@ void FlatBufferClient::sendErrorReply(const std::string &error) // send reply sendMessage(); + + _builder.Clear(); } diff --git a/libsrc/flatbufserver/FlatBufferConnection.cpp b/libsrc/flatbufserver/FlatBufferConnection.cpp index 07e8a1b1..966ee342 100644 --- a/libsrc/flatbufserver/FlatBufferConnection.cpp +++ b/libsrc/flatbufserver/FlatBufferConnection.cpp @@ -66,7 +66,7 @@ void FlatBufferConnection::readData() if((uint32_t) _receiveBuffer.size() < messageSize + 4) return; // extract message only and remove header + msg from buffer :: QByteArray::remove() does not return the removed data - const QByteArray msg = _receiveBuffer.right(messageSize); + const QByteArray msg = _receiveBuffer.mid(4, messageSize); _receiveBuffer.remove(0, messageSize + 4); const uint8_t* msgData = reinterpret_cast(msg.constData()); @@ -117,6 +117,7 @@ void FlatBufferConnection::setColor(const ColorRgb & color, int priority, int du _builder.Finish(req); sendMessage(_builder.GetBufferPointer(), _builder.GetSize()); + _builder.Clear(); } void FlatBufferConnection::setImage(const Image &image) @@ -128,6 +129,7 @@ void FlatBufferConnection::setImage(const Image &image) _builder.Finish(req); sendMessage(_builder.GetBufferPointer(), _builder.GetSize()); + _builder.Clear(); } void FlatBufferConnection::clear(int priority) @@ -137,6 +139,7 @@ void FlatBufferConnection::clear(int priority) _builder.Finish(req); sendMessage(_builder.GetBufferPointer(), _builder.GetSize()); + _builder.Clear(); } void FlatBufferConnection::clearAll() @@ -193,7 +196,6 @@ void FlatBufferConnection::sendMessage(const uint8_t* buffer, uint32_t size) count += _socket.write(reinterpret_cast(header), 4); count += _socket.write(reinterpret_cast(buffer), size); _socket.flush(); - _builder.Clear(); } bool FlatBufferConnection::parseReply(const hyperionnet::Reply *reply) diff --git a/libsrc/hyperion/MessageForwarder.cpp b/libsrc/hyperion/MessageForwarder.cpp index 41b3e5a0..579c8587 100644 --- a/libsrc/hyperion/MessageForwarder.cpp +++ b/libsrc/hyperion/MessageForwarder.cpp @@ -118,9 +118,9 @@ void MessageForwarder::handlePriorityChanges(const quint8 &priority) hyperion::Components activeCompId = _hyperion->getPriorityInfo(priority).componentId; if (activeCompId == hyperion::COMP_GRABBER || activeCompId == hyperion::COMP_V4L) { - if ( !obj["proto"].isNull() ) + if ( !obj["flat"].isNull() ) { - const QJsonArray & addr = obj["proto"].toArray(); + const QJsonArray & addr = obj["flat"].toArray(); for (const auto& entry : addr) { addFlatbufferSlave(entry.toString()); @@ -202,7 +202,7 @@ void MessageForwarder::addFlatbufferSlave(QString slave) return; } - // verify loop with protoserver + // verify loop with flatbufserver const QJsonObject &obj = _hyperion->getSetting(settings::FLATBUFSERVER).object(); if(QHostAddress(parts[0]) == QHostAddress::LocalHost && parts[1].toInt() == obj["port"].toInt()) {