| 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 #include "base/process/launch.h" | 5 #include "base/process/launch.h" |
| 6 | 6 |
| 7 #include <dirent.h> | 7 #include <dirent.h> |
| 8 #include <errno.h> | 8 #include <errno.h> |
| 9 #include <fcntl.h> | 9 #include <fcntl.h> |
| 10 #include <sched.h> | 10 #include <sched.h> |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 size_t fd_shuffle_size = 0; | 340 size_t fd_shuffle_size = 0; |
| 341 if (options.fds_to_remap) { | 341 if (options.fds_to_remap) { |
| 342 fd_shuffle_size = options.fds_to_remap->size(); | 342 fd_shuffle_size = options.fds_to_remap->size(); |
| 343 } | 343 } |
| 344 | 344 |
| 345 InjectiveMultimap fd_shuffle1; | 345 InjectiveMultimap fd_shuffle1; |
| 346 InjectiveMultimap fd_shuffle2; | 346 InjectiveMultimap fd_shuffle2; |
| 347 fd_shuffle1.reserve(fd_shuffle_size); | 347 fd_shuffle1.reserve(fd_shuffle_size); |
| 348 fd_shuffle2.reserve(fd_shuffle_size); | 348 fd_shuffle2.reserve(fd_shuffle_size); |
| 349 | 349 |
| 350 scoped_ptr<char*[]> argv_cstr(new char*[argv.size() + 1]); | 350 scoped_ptr<char* []> argv_cstr(new char* [argv.size() + 1]); |
| 351 for (size_t i = 0; i < argv.size(); i++) { |
| 352 argv_cstr[i] = const_cast<char*>(argv[i].c_str()); |
| 353 } |
| 354 argv_cstr[argv.size()] = NULL; |
| 355 |
| 351 scoped_ptr<char*[]> new_environ; | 356 scoped_ptr<char*[]> new_environ; |
| 352 char* const empty_environ = NULL; | 357 char* const empty_environ = NULL; |
| 353 char* const* old_environ = GetEnvironment(); | 358 char* const* old_environ = GetEnvironment(); |
| 354 if (options.clear_environ) | 359 if (options.clear_environ) |
| 355 old_environ = &empty_environ; | 360 old_environ = &empty_environ; |
| 356 if (!options.environ.empty()) | 361 if (!options.environ.empty()) |
| 357 new_environ = AlterEnvironment(old_environ, options.environ); | 362 new_environ = AlterEnvironment(old_environ, options.environ); |
| 358 | 363 |
| 359 sigset_t full_sigset; | 364 sigset_t full_sigset; |
| 360 sigfillset(&full_sigset); | 365 sigfillset(&full_sigset); |
| 361 const sigset_t orig_sigmask = SetSignalMask(full_sigset); | 366 const sigset_t orig_sigmask = SetSignalMask(full_sigset); |
| 362 | 367 |
| 368 const char* current_directory = nullptr; |
| 369 if (!options.current_directory.empty()) { |
| 370 current_directory = options.current_directory.value().c_str(); |
| 371 } |
| 372 |
| 363 pid_t pid; | 373 pid_t pid; |
| 364 #if defined(OS_LINUX) | 374 #if defined(OS_LINUX) |
| 365 if (options.clone_flags) { | 375 if (options.clone_flags) { |
| 366 // Signal handling in this function assumes the creation of a new | 376 // Signal handling in this function assumes the creation of a new |
| 367 // process, so we check that a thread is not being created by mistake | 377 // process, so we check that a thread is not being created by mistake |
| 368 // and that signal handling follows the process-creation rules. | 378 // and that signal handling follows the process-creation rules. |
| 369 RAW_CHECK( | 379 RAW_CHECK( |
| 370 !(options.clone_flags & (CLONE_SIGHAND | CLONE_THREAD | CLONE_VM))); | 380 !(options.clone_flags & (CLONE_SIGHAND | CLONE_THREAD | CLONE_VM))); |
| 371 | 381 |
| 372 // We specify a null ptid and ctid. | 382 // We specify a null ptid and ctid. |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 508 #define PR_SET_NO_NEW_PRIVS 38 | 518 #define PR_SET_NO_NEW_PRIVS 38 |
| 509 #endif | 519 #endif |
| 510 if (!options.allow_new_privs) { | 520 if (!options.allow_new_privs) { |
| 511 if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) && errno != EINVAL) { | 521 if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) && errno != EINVAL) { |
| 512 // Only log if the error is not EINVAL (i.e. not supported). | 522 // Only log if the error is not EINVAL (i.e. not supported). |
| 513 RAW_LOG(FATAL, "prctl(PR_SET_NO_NEW_PRIVS) failed"); | 523 RAW_LOG(FATAL, "prctl(PR_SET_NO_NEW_PRIVS) failed"); |
| 514 } | 524 } |
| 515 } | 525 } |
| 516 #endif | 526 #endif |
| 517 | 527 |
| 518 #if defined(OS_POSIX) | 528 if (current_directory != nullptr) { |
| 529 RAW_CHECK(chdir(current_directory) == 0); |
| 530 } |
| 531 |
| 519 if (options.pre_exec_delegate != nullptr) { | 532 if (options.pre_exec_delegate != nullptr) { |
| 520 options.pre_exec_delegate->RunAsyncSafe(); | 533 options.pre_exec_delegate->RunAsyncSafe(); |
| 521 } | 534 } |
| 522 #endif | |
| 523 | 535 |
| 524 for (size_t i = 0; i < argv.size(); i++) | |
| 525 argv_cstr[i] = const_cast<char*>(argv[i].c_str()); | |
| 526 argv_cstr[argv.size()] = NULL; | |
| 527 execvp(argv_cstr[0], argv_cstr.get()); | 536 execvp(argv_cstr[0], argv_cstr.get()); |
| 528 | 537 |
| 529 RAW_LOG(ERROR, "LaunchProcess: failed to execvp:"); | 538 RAW_LOG(ERROR, "LaunchProcess: failed to execvp:"); |
| 530 RAW_LOG(ERROR, argv_cstr[0]); | 539 RAW_LOG(ERROR, argv_cstr[0]); |
| 531 _exit(127); | 540 _exit(127); |
| 532 } else { | 541 } else { |
| 533 // Parent process | 542 // Parent process |
| 534 if (options.wait) { | 543 if (options.wait) { |
| 535 // While this isn't strictly disk IO, waiting for another process to | 544 // While this isn't strictly disk IO, waiting for another process to |
| 536 // finish is the sort of thing ThreadRestrictions is trying to prevent. | 545 // finish is the sort of thing ThreadRestrictions is trying to prevent. |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 759 jmp_buf env; | 768 jmp_buf env; |
| 760 if (setjmp(env) == 0) { | 769 if (setjmp(env) == 0) { |
| 761 return CloneAndLongjmpInChild(flags, ptid, ctid, &env); | 770 return CloneAndLongjmpInChild(flags, ptid, ctid, &env); |
| 762 } | 771 } |
| 763 | 772 |
| 764 return 0; | 773 return 0; |
| 765 } | 774 } |
| 766 #endif // defined(OS_LINUX) | 775 #endif // defined(OS_LINUX) |
| 767 | 776 |
| 768 } // namespace base | 777 } // namespace base |
| OLD | NEW |