From d3761d8274036f03107712dd0d27a3ce7ae1a1f0 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Fri, 18 Feb 2022 21:46:21 -0800 Subject: Crash the agent when receiving an invalid TextEventMessage Test: later Bug: N/A Change-Id: I9840bb3802bfd5cf4891bc8d2017bf6c6ce6b080 --- .../app/src/main/cpp/base128_input_stream.cc | 10 ++++++---- .../app/src/main/cpp/base128_input_stream.h | 2 +- .../screen-sharing-agent/app/src/main/cpp/control_messages.cc | 7 +++++-- 3 files changed, 12 insertions(+), 7 deletions(-) (limited to 'emulator') diff --git a/emulator/screen-sharing-agent/app/src/main/cpp/base128_input_stream.cc b/emulator/screen-sharing-agent/app/src/main/cpp/base128_input_stream.cc index d5f63ee494f..6d36e693a82 100644 --- a/emulator/screen-sharing-agent/app/src/main/cpp/base128_input_stream.cc +++ b/emulator/screen-sharing-agent/app/src/main/cpp/base128_input_stream.cc @@ -18,6 +18,8 @@ #include +#include + namespace screensharing { using namespace std; @@ -112,7 +114,7 @@ bool Base128InputStream::ReadBool() { return c != 0; } -u16string Base128InputStream::ReadString16() { +unique_ptr Base128InputStream::ReadString16() { int len = ReadInt32(); if (len < 0) { throw StreamFormatException::InvalidFormat(); @@ -122,12 +124,12 @@ u16string Base128InputStream::ReadString16() { } --len; if (len == 0) { - return u16string(); + return make_unique(); } - auto result = u16string(static_cast(len), '\0'); + auto result = make_unique(static_cast(len), '\0'); try { for (int i = 0; i < len; i++) { - result[i] = ReadUInt16(); + (*result)[i] = ReadUInt16(); } } catch (EndOfFile& e) { throw StreamFormatException::PrematureEndOfStream(); diff --git a/emulator/screen-sharing-agent/app/src/main/cpp/base128_input_stream.h b/emulator/screen-sharing-agent/app/src/main/cpp/base128_input_stream.h index 82627f4c75b..ad57c7eb163 100644 --- a/emulator/screen-sharing-agent/app/src/main/cpp/base128_input_stream.h +++ b/emulator/screen-sharing-agent/app/src/main/cpp/base128_input_stream.h @@ -44,7 +44,7 @@ public: int64_t ReadInt64(); uint64_t ReadUInt64() { return static_cast(ReadInt64()); } bool ReadBool(); - std::u16string ReadString16(); + std::unique_ptr ReadString16(); class StreamFormatException : public IoException { public: diff --git a/emulator/screen-sharing-agent/app/src/main/cpp/control_messages.cc b/emulator/screen-sharing-agent/app/src/main/cpp/control_messages.cc index 5c908140eb1..210f524cc15 100644 --- a/emulator/screen-sharing-agent/app/src/main/cpp/control_messages.cc +++ b/emulator/screen-sharing-agent/app/src/main/cpp/control_messages.cc @@ -71,8 +71,11 @@ KeyEventMessage* KeyEventMessage::deserialize(Base128InputStream& stream) { } TextInputMessage* TextInputMessage::deserialize(Base128InputStream& stream) { - u16string text = stream.ReadString16(); - return new TextInputMessage(text); + unique_ptr text = stream.ReadString16(); + if (text == nullptr || text->empty()) { + Log::Fatal("Received a TextInputMessage without text"); + } + return new TextInputMessage(*text); } SetDeviceOrientationMessage* SetDeviceOrientationMessage::deserialize(Base128InputStream& stream) { -- cgit v1.2.3