From 928e42f90f401cab24092748831062303965014b Mon Sep 17 00:00:00 2001 From: Vladimir Byko-Ianko Date: Wed, 27 May 2020 16:24:15 +0300 Subject: [PATCH] [tracking] No sigsegv in case of a wrong packet. --- tracking/protocol.cpp | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/tracking/protocol.cpp b/tracking/protocol.cpp index cfdf047381..355047d301 100644 --- a/tracking/protocol.cpp +++ b/tracking/protocol.cpp @@ -1,9 +1,11 @@ #include "tracking/protocol.hpp" #include "coding/endianness.hpp" +#include "coding/reader.hpp" #include "coding/writer.hpp" #include "base/assert.hpp" +#include "base/logging.hpp" #include @@ -101,19 +103,27 @@ string Protocol::DecodeAuthPacket(Protocol::PacketType type, vector con Protocol::DataElementsVec Protocol::DecodeDataPacket(PacketType type, vector const & data) { DataElementsVec points; - MemReader memReader(data.data(), data.size()); - ReaderSource src(memReader); - switch (type) + MemReaderWithExceptions memReader(data.data(), data.size()); + ReaderSource src(memReader); + try { - case Protocol::PacketType::DataV0: - Encoder::DeserializeDataPoints(0 /* version */, src, points); - break; - case Protocol::PacketType::DataV1: - Encoder::DeserializeDataPoints(1 /* version */, src, points); - break; - case Protocol::PacketType::AuthV0: ASSERT(false, ("Not a DATA packet.")); break; + switch (type) + { + case Protocol::PacketType::DataV0: + Encoder::DeserializeDataPoints(0 /* version */, src, points); + break; + case Protocol::PacketType::DataV1: + Encoder::DeserializeDataPoints(1 /* version */, src, points); + break; + case Protocol::PacketType::AuthV0: ASSERT(false, ("Not a DATA packet.")); break; + } + return points; + } + catch (Reader::SizeException const & ex) + { + LOG(LERROR, ("Wrong packet. SizeException. Msg:", ex.Msg(), ". What:", ex.what())); + return {}; } - return points; } // static