Index: ipc/ipc_channel_reader_unittest.cc |
diff --git a/ipc/ipc_channel_reader_unittest.cc b/ipc/ipc_channel_reader_unittest.cc |
index 005898015bf6d40e607b2113838908ac37b73a5c..7728a8173776054436d7ebcb9ca76f863454ce3e 100644 |
--- a/ipc/ipc_channel_reader_unittest.cc |
+++ b/ipc/ipc_channel_reader_unittest.cc |
@@ -4,6 +4,7 @@ |
#include "build/build_config.h" |
+#include <limits> |
#include <set> |
#include "ipc/attachment_broker.h" |
@@ -12,12 +13,13 @@ |
#include "ipc/placeholder_brokerable_attachment.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-#if USE_ATTACHMENT_BROKER |
namespace IPC { |
namespace internal { |
namespace { |
+#if USE_ATTACHMENT_BROKER |
+ |
class MockAttachment : public BrokerableAttachment { |
public: |
MockAttachment() {} |
@@ -53,6 +55,8 @@ class MockAttachmentBroker : public AttachmentBroker { |
} |
}; |
+#endif // USE_ATTACHMENT_BROKER |
+ |
class MockChannelReader : public ChannelReader { |
public: |
MockChannelReader() |
@@ -92,8 +96,16 @@ class MockChannelReader : public ChannelReader { |
AttachmentBroker* broker_; |
}; |
+class ExposedMessage: public Message { |
+ public: |
+ using Message::Header; |
+ using Message::header; |
+}; |
+ |
} // namespace |
+#if USE_ATTACHMENT_BROKER |
+ |
TEST(ChannelReaderTest, AttachmentAlreadyBrokered) { |
MockAttachmentBroker broker; |
MockChannelReader reader; |
@@ -129,6 +141,55 @@ TEST(ChannelReaderTest, AttachmentNotYetBrokered) { |
EXPECT_EQ(m, reader.get_last_dispatched_message()); |
} |
+#endif // USE_ATTACHMENT_BROKER |
+ |
+#if !USE_ATTACHMENT_BROKER |
+ |
+// We can determine message size from its header (and hence resize the buffer) |
+// only when attachment broker is not used, see IPC::Message::FindNext(). |
+ |
+TEST(ChannelReaderTest, ResizeOverflowBuffer) { |
+ MockChannelReader reader; |
+ |
+ ExposedMessage::Header header = {}; |
+ |
+ header.payload_size = 128 * 1024; |
+ EXPECT_LT(reader.input_overflow_buf_.capacity(), header.payload_size); |
+ EXPECT_TRUE(reader.TranslateInputData( |
+ reinterpret_cast<const char*>(&header), sizeof(header))); |
+ |
+ // Once message header is available we resize overflow buffer to |
+ // fit the entire message. |
+ EXPECT_GE(reader.input_overflow_buf_.capacity(), header.payload_size); |
+} |
+ |
+TEST(ChannelReaderTest, InvalidMessageSize) { |
+ MockChannelReader reader; |
+ |
+ ExposedMessage::Header header = {}; |
+ |
+ size_t capacity_before = reader.input_overflow_buf_.capacity(); |
+ |
+ // Message is slightly larger than maximum allowed size |
+ header.payload_size = Channel::kMaximumMessageSize + 1; |
+ EXPECT_FALSE(reader.TranslateInputData( |
+ reinterpret_cast<const char*>(&header), sizeof(header))); |
+ EXPECT_LE(reader.input_overflow_buf_.capacity(), capacity_before); |
+ |
+ // Payload size is negative, overflow is detected by Pickle::PeekNext() |
+ header.payload_size = static_cast<uint32_t>(-1); |
+ EXPECT_FALSE(reader.TranslateInputData( |
+ reinterpret_cast<const char*>(&header), sizeof(header))); |
+ EXPECT_LE(reader.input_overflow_buf_.capacity(), capacity_before); |
+ |
+ // Payload size is maximum int32 value |
+ header.payload_size = std::numeric_limits<int32_t>::max(); |
+ EXPECT_FALSE(reader.TranslateInputData( |
+ reinterpret_cast<const char*>(&header), sizeof(header))); |
+ EXPECT_LE(reader.input_overflow_buf_.capacity(), capacity_before); |
+} |
+ |
+#endif // !USE_ATTACHMENT_BROKER |
+ |
} // namespace internal |
} // namespace IPC |
-#endif // USE_ATTACHMENT_BROKER |