OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #define _CRT_SECURE_NO_WARNINGS | 5 #define _CRT_SECURE_NO_WARNINGS |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/debug/alias.h" | 10 #include "base/debug/alias.h" |
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
435 if ((fd = HANDLE_EINTR(dup(i))) != -1) { | 435 if ((fd = HANDLE_EINTR(dup(i))) != -1) { |
436 close(fd); | 436 close(fd); |
437 num_open_files += 1; | 437 num_open_files += 1; |
438 } | 438 } |
439 } | 439 } |
440 } | 440 } |
441 | 441 |
442 int written = HANDLE_EINTR(write(write_pipe, &num_open_files, | 442 int written = HANDLE_EINTR(write(write_pipe, &num_open_files, |
443 sizeof(num_open_files))); | 443 sizeof(num_open_files))); |
444 DCHECK_EQ(static_cast<size_t>(written), sizeof(num_open_files)); | 444 DCHECK_EQ(static_cast<size_t>(written), sizeof(num_open_files)); |
445 int ret = HANDLE_EINTR(close(write_pipe)); | 445 int ret = IGNORE_EINTR(close(write_pipe)); |
446 DPCHECK(ret == 0); | 446 DPCHECK(ret == 0); |
447 | 447 |
448 return 0; | 448 return 0; |
449 } | 449 } |
450 | 450 |
451 int ProcessUtilTest::CountOpenFDsInChild() { | 451 int ProcessUtilTest::CountOpenFDsInChild() { |
452 int fds[2]; | 452 int fds[2]; |
453 if (pipe(fds) < 0) | 453 if (pipe(fds) < 0) |
454 NOTREACHED(); | 454 NOTREACHED(); |
455 | 455 |
456 base::FileHandleMappingVector fd_mapping_vec; | 456 base::FileHandleMappingVector fd_mapping_vec; |
457 fd_mapping_vec.push_back(std::pair<int, int>(fds[1], kChildPipe)); | 457 fd_mapping_vec.push_back(std::pair<int, int>(fds[1], kChildPipe)); |
458 base::ProcessHandle handle = this->SpawnChild( | 458 base::ProcessHandle handle = this->SpawnChild( |
459 "ProcessUtilsLeakFDChildProcess", fd_mapping_vec, false); | 459 "ProcessUtilsLeakFDChildProcess", fd_mapping_vec, false); |
460 CHECK(handle); | 460 CHECK(handle); |
461 int ret = HANDLE_EINTR(close(fds[1])); | 461 int ret = IGNORE_EINTR(close(fds[1])); |
462 DPCHECK(ret == 0); | 462 DPCHECK(ret == 0); |
463 | 463 |
464 // Read number of open files in client process from pipe; | 464 // Read number of open files in client process from pipe; |
465 int num_open_files = -1; | 465 int num_open_files = -1; |
466 ssize_t bytes_read = | 466 ssize_t bytes_read = |
467 HANDLE_EINTR(read(fds[0], &num_open_files, sizeof(num_open_files))); | 467 HANDLE_EINTR(read(fds[0], &num_open_files, sizeof(num_open_files))); |
468 CHECK_EQ(bytes_read, static_cast<ssize_t>(sizeof(num_open_files))); | 468 CHECK_EQ(bytes_read, static_cast<ssize_t>(sizeof(num_open_files))); |
469 | 469 |
470 #if defined(THREAD_SANITIZER) || defined(USE_HEAPCHECKER) | 470 #if defined(THREAD_SANITIZER) || defined(USE_HEAPCHECKER) |
471 // Compiler-based ThreadSanitizer makes this test slow. | 471 // Compiler-based ThreadSanitizer makes this test slow. |
472 CHECK(base::WaitForSingleProcess(handle, base::TimeDelta::FromSeconds(3))); | 472 CHECK(base::WaitForSingleProcess(handle, base::TimeDelta::FromSeconds(3))); |
473 #else | 473 #else |
474 CHECK(base::WaitForSingleProcess(handle, base::TimeDelta::FromSeconds(1))); | 474 CHECK(base::WaitForSingleProcess(handle, base::TimeDelta::FromSeconds(1))); |
475 #endif | 475 #endif |
476 base::CloseProcessHandle(handle); | 476 base::CloseProcessHandle(handle); |
477 ret = HANDLE_EINTR(close(fds[0])); | 477 ret = IGNORE_EINTR(close(fds[0])); |
478 DPCHECK(ret == 0); | 478 DPCHECK(ret == 0); |
479 | 479 |
480 return num_open_files; | 480 return num_open_files; |
481 } | 481 } |
482 | 482 |
483 #if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) | 483 #if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) |
484 // ProcessUtilTest.FDRemapping is flaky when ran under xvfb-run on Precise. | 484 // ProcessUtilTest.FDRemapping is flaky when ran under xvfb-run on Precise. |
485 // The problem is 100% reproducible with both ASan and TSan. | 485 // The problem is 100% reproducible with both ASan and TSan. |
486 // See http://crbug.com/136720. | 486 // See http://crbug.com/136720. |
487 #define MAYBE_FDRemapping DISABLED_FDRemapping | 487 #define MAYBE_FDRemapping DISABLED_FDRemapping |
488 #else | 488 #else |
489 #define MAYBE_FDRemapping FDRemapping | 489 #define MAYBE_FDRemapping FDRemapping |
490 #endif | 490 #endif |
491 TEST_F(ProcessUtilTest, MAYBE_FDRemapping) { | 491 TEST_F(ProcessUtilTest, MAYBE_FDRemapping) { |
492 int fds_before = CountOpenFDsInChild(); | 492 int fds_before = CountOpenFDsInChild(); |
493 | 493 |
494 // open some dummy fds to make sure they don't propagate over to the | 494 // open some dummy fds to make sure they don't propagate over to the |
495 // child process. | 495 // child process. |
496 int dev_null = open("/dev/null", O_RDONLY); | 496 int dev_null = open("/dev/null", O_RDONLY); |
497 int sockets[2]; | 497 int sockets[2]; |
498 socketpair(AF_UNIX, SOCK_STREAM, 0, sockets); | 498 socketpair(AF_UNIX, SOCK_STREAM, 0, sockets); |
499 | 499 |
500 int fds_after = CountOpenFDsInChild(); | 500 int fds_after = CountOpenFDsInChild(); |
501 | 501 |
502 ASSERT_EQ(fds_after, fds_before); | 502 ASSERT_EQ(fds_after, fds_before); |
503 | 503 |
504 int ret; | 504 int ret; |
505 ret = HANDLE_EINTR(close(sockets[0])); | 505 ret = IGNORE_EINTR(close(sockets[0])); |
506 DPCHECK(ret == 0); | 506 DPCHECK(ret == 0); |
507 ret = HANDLE_EINTR(close(sockets[1])); | 507 ret = IGNORE_EINTR(close(sockets[1])); |
508 DPCHECK(ret == 0); | 508 DPCHECK(ret == 0); |
509 ret = HANDLE_EINTR(close(dev_null)); | 509 ret = IGNORE_EINTR(close(dev_null)); |
510 DPCHECK(ret == 0); | 510 DPCHECK(ret == 0); |
511 } | 511 } |
512 | 512 |
513 namespace { | 513 namespace { |
514 | 514 |
515 std::string TestLaunchProcess(const base::EnvironmentMap& env_changes, | 515 std::string TestLaunchProcess(const base::EnvironmentMap& env_changes, |
516 const int clone_flags) { | 516 const int clone_flags) { |
517 std::vector<std::string> args; | 517 std::vector<std::string> args; |
518 base::FileHandleMappingVector fds_to_remap; | 518 base::FileHandleMappingVector fds_to_remap; |
519 | 519 |
520 args.push_back(kPosixShell); | 520 args.push_back(kPosixShell); |
521 args.push_back("-c"); | 521 args.push_back("-c"); |
522 args.push_back("echo $BASE_TEST"); | 522 args.push_back("echo $BASE_TEST"); |
523 | 523 |
524 int fds[2]; | 524 int fds[2]; |
525 PCHECK(pipe(fds) == 0); | 525 PCHECK(pipe(fds) == 0); |
526 | 526 |
527 fds_to_remap.push_back(std::make_pair(fds[1], 1)); | 527 fds_to_remap.push_back(std::make_pair(fds[1], 1)); |
528 base::LaunchOptions options; | 528 base::LaunchOptions options; |
529 options.wait = true; | 529 options.wait = true; |
530 options.environ = env_changes; | 530 options.environ = env_changes; |
531 options.fds_to_remap = &fds_to_remap; | 531 options.fds_to_remap = &fds_to_remap; |
532 #if defined(OS_LINUX) | 532 #if defined(OS_LINUX) |
533 options.clone_flags = clone_flags; | 533 options.clone_flags = clone_flags; |
534 #else | 534 #else |
535 CHECK_EQ(0, clone_flags); | 535 CHECK_EQ(0, clone_flags); |
536 #endif // OS_LINUX | 536 #endif // OS_LINUX |
537 EXPECT_TRUE(base::LaunchProcess(args, options, NULL)); | 537 EXPECT_TRUE(base::LaunchProcess(args, options, NULL)); |
538 PCHECK(HANDLE_EINTR(close(fds[1])) == 0); | 538 PCHECK(IGNORE_EINTR(close(fds[1])) == 0); |
539 | 539 |
540 char buf[512]; | 540 char buf[512]; |
541 const ssize_t n = HANDLE_EINTR(read(fds[0], buf, sizeof(buf))); | 541 const ssize_t n = HANDLE_EINTR(read(fds[0], buf, sizeof(buf))); |
542 PCHECK(n > 0); | 542 PCHECK(n > 0); |
543 | 543 |
544 PCHECK(HANDLE_EINTR(close(fds[0])) == 0); | 544 PCHECK(IGNORE_EINTR(close(fds[0])) == 0); |
545 | 545 |
546 return std::string(buf, n); | 546 return std::string(buf, n); |
547 } | 547 } |
548 | 548 |
549 const char kLargeString[] = | 549 const char kLargeString[] = |
550 "0123456789012345678901234567890123456789012345678901234567890123456789" | 550 "0123456789012345678901234567890123456789012345678901234567890123456789" |
551 "0123456789012345678901234567890123456789012345678901234567890123456789" | 551 "0123456789012345678901234567890123456789012345678901234567890123456789" |
552 "0123456789012345678901234567890123456789012345678901234567890123456789" | 552 "0123456789012345678901234567890123456789012345678901234567890123456789" |
553 "0123456789012345678901234567890123456789012345678901234567890123456789" | 553 "0123456789012345678901234567890123456789012345678901234567890123456789" |
554 "0123456789012345678901234567890123456789012345678901234567890123456789" | 554 "0123456789012345678901234567890123456789012345678901234567890123456789" |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 // Check that process was really killed. | 791 // Check that process was really killed. |
792 EXPECT_TRUE(IsProcessDead(child_process)); | 792 EXPECT_TRUE(IsProcessDead(child_process)); |
793 base::CloseProcessHandle(child_process); | 793 base::CloseProcessHandle(child_process); |
794 } | 794 } |
795 | 795 |
796 MULTIPROCESS_TEST_MAIN(process_util_test_die_immediately) { | 796 MULTIPROCESS_TEST_MAIN(process_util_test_die_immediately) { |
797 return 0; | 797 return 0; |
798 } | 798 } |
799 | 799 |
800 #endif // defined(OS_POSIX) | 800 #endif // defined(OS_POSIX) |
OLD | NEW |