Index: ipc/ipc_message_unittest.cc |
diff --git a/ipc/ipc_message_unittest.cc b/ipc/ipc_message_unittest.cc |
index aea705449cce9c0daa7a094b86504df94c5e92a8..a4f9af07244c6491fdc303f565aafc67e081f0bc 100644 |
--- a/ipc/ipc_message_unittest.cc |
+++ b/ipc/ipc_message_unittest.cc |
@@ -6,6 +6,8 @@ |
#include <string.h> |
+#include <limits> |
+ |
#include "base/memory/scoped_ptr.h" |
#include "base/strings/utf_string_conversions.h" |
#include "base/values.h" |
@@ -25,7 +27,7 @@ IPC_MESSAGE_CONTROL1(TestMsgClassI, int) |
IPC_SYNC_MESSAGE_CONTROL1_1(TestMsgClassIS, int, std::string) |
-namespace { |
+namespace IPC { |
TEST(IPCMessageTest, BasicMessageTest) { |
int v1 = 10; |
@@ -115,6 +117,101 @@ TEST(IPCMessageTest, DictionaryValue) { |
EXPECT_FALSE(IPC::ReadParam(&bad_msg, &iter, &output)); |
} |
+TEST(IPCMessageTest, FindNext) { |
+ IPC::Message message; |
+ EXPECT_TRUE(message.WriteString("Goooooooogle")); |
+ EXPECT_TRUE(message.WriteInt(111)); |
+ |
+ std::vector<char> message_data(message.size() + 7); |
+ memcpy(message_data.data(), message.data(), message.size()); |
+ |
+ const char* data_start = message_data.data(); |
+ const char* data_end = data_start + message.size(); |
+ |
+ IPC::Message::NextMessageInfo next; |
+ |
+ // Data range contains the entire message plus some extra bytes |
+ IPC::Message::FindNext(data_start, data_end + 1, &next); |
+ EXPECT_TRUE(next.message_found); |
+ EXPECT_EQ(next.message_size, message.size()); |
+ EXPECT_EQ(next.pickle_end, data_end); |
+ EXPECT_EQ(next.message_end, data_end); |
+ |
+ // Data range exactly contains the entire message |
+ IPC::Message::FindNext(data_start, data_end, &next); |
+ EXPECT_TRUE(next.message_found); |
+ EXPECT_EQ(next.message_size, message.size()); |
+ EXPECT_EQ(next.pickle_end, data_end); |
+ EXPECT_EQ(next.message_end, data_end); |
+ |
+ // Data range doesn't contain the entire message |
+ // (but contains the message header) |
+ IPC::Message::FindNext(data_start, data_end - 1, &next); |
+ EXPECT_FALSE(next.message_found); |
+#if USE_ATTACHMENT_BROKER |
+ EXPECT_EQ(next.message_size, 0u); |
+#else |
+ EXPECT_EQ(next.message_size, message.size()); |
+#endif |
+ |
+ // Data range doesn't contain the message header |
+ // (but contains the pickle header) |
+ IPC::Message::FindNext(data_start, |
+ data_start + sizeof(IPC::Message::Header) - 1, |
+ &next); |
+ EXPECT_FALSE(next.message_found); |
+ EXPECT_EQ(next.message_size, 0u); |
+ |
+ // Data range doesn't contain the pickle header |
+ IPC::Message::FindNext(data_start, |
+ data_start + sizeof(base::Pickle::Header) - 1, |
+ &next); |
+ EXPECT_FALSE(next.message_found); |
+ EXPECT_EQ(next.message_size, 0u); |
+} |
+ |
+TEST(IPCMessageTest, FindNextOverflow) { |
+ IPC::Message message; |
+ EXPECT_TRUE(message.WriteString("Data")); |
+ EXPECT_TRUE(message.WriteInt(777)); |
+ |
+ const char* data_start = reinterpret_cast<const char*>(message.data()); |
+ const char* data_end = data_start + message.size(); |
+ |
+ IPC::Message::NextMessageInfo next; |
+ |
+ // Payload size is negative (defeats 'start + size > end' check) |
+ message.header()->payload_size = static_cast<uint32_t>(-1); |
+ IPC::Message::FindNext(data_start, data_end, &next); |
+ EXPECT_FALSE(next.message_found); |
+#if USE_ATTACHMENT_BROKER |
+ EXPECT_EQ(next.message_size, 0u); |
+#else |
+ if (sizeof(size_t) > sizeof(uint32_t)) { |
+ // No overflow, just insane message size |
+ EXPECT_EQ(next.message_size, |
+ message.header()->payload_size + sizeof(IPC::Message::Header)); |
+ } else { |
+ // Actual overflow, reported as max size_t |
+ EXPECT_EQ(next.message_size, std::numeric_limits<size_t>::max()); |
+ } |
+#endif |
+ |
+ // Payload size is max positive integer (defeats size < 0 check, while |
+ // still potentially causing overflow down the road). |
+ message.header()->payload_size = std::numeric_limits<int32_t>::max(); |
+ IPC::Message::FindNext(data_start, data_end, &next); |
+ EXPECT_FALSE(next.message_found); |
+#if USE_ATTACHMENT_BROKER |
+ EXPECT_EQ(next.message_size, 0u); |
+#else |
+ EXPECT_EQ(next.message_size, |
+ message.header()->payload_size + sizeof(IPC::Message::Header)); |
+#endif |
+} |
+ |
+namespace { |
+ |
class IPCMessageParameterTest : public testing::Test { |
public: |
IPCMessageParameterTest() : extra_param_("extra_param"), called_(false) {} |
@@ -160,6 +257,8 @@ class IPCMessageParameterTest : public testing::Test { |
bool called_; |
}; |
+} // namespace |
+ |
TEST_F(IPCMessageParameterTest, EmptyDispatcherWithParam) { |
TestMsgClassEmpty message; |
EXPECT_TRUE(OnMessageReceived(message)); |
@@ -186,4 +285,4 @@ TEST_F(IPCMessageParameterTest, Sync) { |
EXPECT_EQ(output, std::string("out")); |
}*/ |
-} // namespace |
+} // namespace IPC |