summaryrefslogtreecommitdiff
path: root/emulator
diff options
context:
space:
mode:
authorSergey Prigogin <sprigogin@google.com>2022-02-18 21:46:21 -0800
committerSergey Prigogin <sprigogin@google.com>2022-02-22 20:54:15 +0000
commitd3761d8274036f03107712dd0d27a3ce7ae1a1f0 (patch)
tree8fd4495c3aee136bad86adf12d117c703b90903a /emulator
parentf2b5812d879b1a0f4551e0c2d3de659be19882d2 (diff)
downloadidea-d3761d8274036f03107712dd0d27a3ce7ae1a1f0.tar.gz
Crash the agent when receiving an invalid TextEventMessage
Test: later Bug: N/A Change-Id: I9840bb3802bfd5cf4891bc8d2017bf6c6ce6b080
Diffstat (limited to 'emulator')
-rw-r--r--emulator/screen-sharing-agent/app/src/main/cpp/base128_input_stream.cc10
-rw-r--r--emulator/screen-sharing-agent/app/src/main/cpp/base128_input_stream.h2
-rw-r--r--emulator/screen-sharing-agent/app/src/main/cpp/control_messages.cc7
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) {