| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdio.h> | 5 #include <stdio.h> |
| 6 #include <iostream> | 6 #include <iostream> |
| 7 #include <string> | 7 #include <string> |
| 8 #include <sstream> | 8 #include <sstream> |
| 9 | 9 |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 int value = 43; | 295 int value = 43; |
| 296 msg = new MsgClassIS(value, L"expect 43"); | 296 msg = new MsgClassIS(value, L"expect 43"); |
| 297 chan.Send(msg); | 297 chan.Send(msg); |
| 298 EXPECT_TRUE(listener.ExpectMessage(value, MsgClassIS::ID)); | 298 EXPECT_TRUE(listener.ExpectMessage(value, MsgClassIS::ID)); |
| 299 | 299 |
| 300 msg = new MsgClassSI(L"expect 44", ++value); | 300 msg = new MsgClassSI(L"expect 44", ++value); |
| 301 chan.Send(msg); | 301 chan.Send(msg); |
| 302 EXPECT_TRUE(listener.ExpectMessage(value, MsgClassSI::ID)); | 302 EXPECT_TRUE(listener.ExpectMessage(value, MsgClassSI::ID)); |
| 303 | 303 |
| 304 EXPECT_TRUE(base::WaitForSingleProcess(server_process, 5000)); | 304 EXPECT_TRUE(base::WaitForSingleProcess(server_process, 5000)); |
| 305 base::CloseProcessHandle(server_process); |
| 305 } | 306 } |
| 306 | 307 |
| 307 // This test uses a payload that is smaller than expected. | 308 // This test uses a payload that is smaller than expected. |
| 308 // This generates an error while unpacking the IPC buffer which in | 309 // This generates an error while unpacking the IPC buffer which in |
| 309 // In debug this triggers an assertion and in release it is ignored(!!). Right | 310 // In debug this triggers an assertion and in release it is ignored(!!). Right |
| 310 // after we generate another valid IPC to make sure framing is working | 311 // after we generate another valid IPC to make sure framing is working |
| 311 // properly. | 312 // properly. |
| 312 #ifdef NDEBUG | 313 #ifdef NDEBUG |
| 313 TEST_F(IPCFuzzingTest, MsgBadPayloadShort) { | 314 TEST_F(IPCFuzzingTest, MsgBadPayloadShort) { |
| 314 FuzzerClientListener listener; | 315 FuzzerClientListener listener; |
| 315 IPC::Channel chan(kFuzzerChannel, IPC::Channel::MODE_SERVER, | 316 IPC::Channel chan(kFuzzerChannel, IPC::Channel::MODE_SERVER, |
| 316 &listener); | 317 &listener); |
| 317 base::ProcessHandle server_process = SpawnChild(FUZZER_SERVER, &chan); | 318 base::ProcessHandle server_process = SpawnChild(FUZZER_SERVER, &chan); |
| 318 ASSERT_TRUE(server_process); | 319 ASSERT_TRUE(server_process); |
| 319 PlatformThread::Sleep(1000); | 320 PlatformThread::Sleep(1000); |
| 320 ASSERT_TRUE(chan.Connect()); | 321 ASSERT_TRUE(chan.Connect()); |
| 321 listener.Init(&chan); | 322 listener.Init(&chan); |
| 322 | 323 |
| 323 IPC::Message* msg = new IPC::Message(MSG_ROUTING_CONTROL, MsgClassIS::ID, | 324 IPC::Message* msg = new IPC::Message(MSG_ROUTING_CONTROL, MsgClassIS::ID, |
| 324 IPC::Message::PRIORITY_NORMAL); | 325 IPC::Message::PRIORITY_NORMAL); |
| 325 msg->WriteInt(666); | 326 msg->WriteInt(666); |
| 326 chan.Send(msg); | 327 chan.Send(msg); |
| 327 EXPECT_TRUE(listener.ExpectMsgNotHandled(MsgClassIS::ID)); | 328 EXPECT_TRUE(listener.ExpectMsgNotHandled(MsgClassIS::ID)); |
| 328 | 329 |
| 329 msg = new MsgClassSI(L"expect one", 1); | 330 msg = new MsgClassSI(L"expect one", 1); |
| 330 chan.Send(msg); | 331 chan.Send(msg); |
| 331 EXPECT_TRUE(listener.ExpectMessage(1, MsgClassSI::ID)); | 332 EXPECT_TRUE(listener.ExpectMessage(1, MsgClassSI::ID)); |
| 332 | 333 |
| 333 EXPECT_TRUE(base::WaitForSingleProcess(server_process, 5000)); | 334 EXPECT_TRUE(base::WaitForSingleProcess(server_process, 5000)); |
| 335 base::CloseProcessHandle(server_process); |
| 334 } | 336 } |
| 335 #endif // NDEBUG | 337 #endif // NDEBUG |
| 336 | 338 |
| 337 // This test uses a payload that has too many arguments, but so the payload | 339 // This test uses a payload that has too many arguments, but so the payload |
| 338 // size is big enough so the unpacking routine does not generate an error as | 340 // size is big enough so the unpacking routine does not generate an error as |
| 339 // in the case of MsgBadPayloadShort test. | 341 // in the case of MsgBadPayloadShort test. |
| 340 // This test does not pinpoint a flaw (per se) as by design we don't carry | 342 // This test does not pinpoint a flaw (per se) as by design we don't carry |
| 341 // type information on the IPC message. | 343 // type information on the IPC message. |
| 342 TEST_F(IPCFuzzingTest, MsgBadPayloadArgs) { | 344 TEST_F(IPCFuzzingTest, MsgBadPayloadArgs) { |
| 343 FuzzerClientListener listener; | 345 FuzzerClientListener listener; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 358 chan.Send(msg); | 360 chan.Send(msg); |
| 359 EXPECT_TRUE(listener.ExpectMessage(0, MsgClassSI::ID)); | 361 EXPECT_TRUE(listener.ExpectMessage(0, MsgClassSI::ID)); |
| 360 | 362 |
| 361 // Now send a well formed message to make sure the receiver wasn't | 363 // Now send a well formed message to make sure the receiver wasn't |
| 362 // thrown out of sync by the extra argument. | 364 // thrown out of sync by the extra argument. |
| 363 msg = new MsgClassIS(3, L"expect three"); | 365 msg = new MsgClassIS(3, L"expect three"); |
| 364 chan.Send(msg); | 366 chan.Send(msg); |
| 365 EXPECT_TRUE(listener.ExpectMessage(3, MsgClassIS::ID)); | 367 EXPECT_TRUE(listener.ExpectMessage(3, MsgClassIS::ID)); |
| 366 | 368 |
| 367 EXPECT_TRUE(base::WaitForSingleProcess(server_process, 5000)); | 369 EXPECT_TRUE(base::WaitForSingleProcess(server_process, 5000)); |
| 370 base::CloseProcessHandle(server_process); |
| 368 } | 371 } |
| 369 | 372 |
| 370 // This class is for testing the IPC_BEGIN_MESSAGE_MAP_EX macros. | 373 // This class is for testing the IPC_BEGIN_MESSAGE_MAP_EX macros. |
| 371 class ServerMacroExTest { | 374 class ServerMacroExTest { |
| 372 public: | 375 public: |
| 373 ServerMacroExTest() : unhandled_msgs_(0) { | 376 ServerMacroExTest() : unhandled_msgs_(0) { |
| 374 } | 377 } |
| 375 virtual bool OnMessageReceived(const IPC::Message& msg) { | 378 virtual bool OnMessageReceived(const IPC::Message& msg) { |
| 376 bool msg_is_ok = false; | 379 bool msg_is_ok = false; |
| 377 IPC_BEGIN_MESSAGE_MAP_EX(ServerMacroExTest, msg, msg_is_ok) | 380 IPC_BEGIN_MESSAGE_MAP_EX(ServerMacroExTest, msg, msg_is_ok) |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 IPC::Message::PRIORITY_NORMAL); | 422 IPC::Message::PRIORITY_NORMAL); |
| 420 msg->WriteInt(0x64); | 423 msg->WriteInt(0x64); |
| 421 msg->WriteInt(0x32); | 424 msg->WriteInt(0x32); |
| 422 EXPECT_FALSE(server.OnMessageReceived(*msg)); | 425 EXPECT_FALSE(server.OnMessageReceived(*msg)); |
| 423 delete msg; | 426 delete msg; |
| 424 | 427 |
| 425 EXPECT_EQ(0, server.unhandled_msgs()); | 428 EXPECT_EQ(0, server.unhandled_msgs()); |
| 426 #endif | 429 #endif |
| 427 } | 430 } |
| 428 | 431 |
| OLD | NEW |