Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(420)

Unified Diff: ipc/ipc_channel_reader_unittest.cc

Issue 1345353004: Resize IPC input buffer to fit the next message. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix tests and address comments Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« ipc/ipc_channel_reader.h ('K') | « ipc/ipc_channel_reader.cc ('k') | ipc/ipc_message.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698