diff options
author | Sergey Prigogin <sprigogin@google.com> | 2022-02-18 21:46:21 -0800 |
---|---|---|
committer | Sergey Prigogin <sprigogin@google.com> | 2022-02-22 20:54:15 +0000 |
commit | d3761d8274036f03107712dd0d27a3ce7ae1a1f0 (patch) | |
tree | 8fd4495c3aee136bad86adf12d117c703b90903a /emulator | |
parent | f2b5812d879b1a0f4551e0c2d3de659be19882d2 (diff) | |
download | idea-d3761d8274036f03107712dd0d27a3ce7ae1a1f0.tar.gz |
Crash the agent when receiving an invalid TextEventMessage
Test: later
Bug: N/A
Change-Id: I9840bb3802bfd5cf4891bc8d2017bf6c6ce6b080
Diffstat (limited to 'emulator')
3 files changed, 12 insertions, 7 deletions
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 <unistd.h> +#include <memory> + namespace screensharing { using namespace std; @@ -112,7 +114,7 @@ bool Base128InputStream::ReadBool() { return c != 0; } -u16string Base128InputStream::ReadString16() { +unique_ptr<u16string> 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<u16string>(); } - auto result = u16string(static_cast<unsigned int>(len), '\0'); + auto result = make_unique<u16string>(static_cast<unsigned int>(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<uint64_t>(ReadInt64()); } bool ReadBool(); - std::u16string ReadString16(); + std::unique_ptr<std::u16string> 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<u16string> text = stream.ReadString16(); + if (text == nullptr || text->empty()) { + Log::Fatal("Received a TextInputMessage without text"); + } + return new TextInputMessage(*text); } SetDeviceOrientationMessage* SetDeviceOrientationMessage::deserialize(Base128InputStream& stream) { |