| 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 "components/nacl/zygote/nacl_fork_delegate_linux.h" | 5 #include "components/nacl/zygote/nacl_fork_delegate_linux.h" |
| 6 | 6 |
| 7 #include <signal.h> | 7 #include <signal.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdlib.h> | 9 #include <stdlib.h> |
| 10 #include <sys/resource.h> | 10 #include <sys/resource.h> |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 | 167 |
| 168 // For communications between the NaCl loader process and | 168 // For communications between the NaCl loader process and |
| 169 // the browser process. | 169 // the browser process. |
| 170 int nacl_sandbox_descriptor = | 170 int nacl_sandbox_descriptor = |
| 171 base::GlobalDescriptors::kBaseDescriptor + kSandboxIPCChannel; | 171 base::GlobalDescriptors::kBaseDescriptor + kSandboxIPCChannel; |
| 172 // Confirm a hard-wired assumption. | 172 // Confirm a hard-wired assumption. |
| 173 DCHECK_EQ(sandboxdesc, nacl_sandbox_descriptor); | 173 DCHECK_EQ(sandboxdesc, nacl_sandbox_descriptor); |
| 174 | 174 |
| 175 int fds[2]; | 175 int fds[2]; |
| 176 PCHECK(0 == socketpair(PF_UNIX, SOCK_SEQPACKET, 0, fds)); | 176 PCHECK(0 == socketpair(PF_UNIX, SOCK_SEQPACKET, 0, fds)); |
| 177 base::FileHandleMappingVector fds_to_map; | |
| 178 fds_to_map.push_back(std::make_pair(fds[1], kNaClZygoteDescriptor)); | |
| 179 fds_to_map.push_back(std::make_pair(sandboxdesc, nacl_sandbox_descriptor)); | |
| 180 | 177 |
| 181 bool use_nacl_bootstrap = false; | 178 bool use_nacl_bootstrap = false; |
| 182 // For non-SFI mode, we do not use fixed address space. | 179 // For non-SFI mode, we do not use fixed address space. |
| 183 if (!nonsfi_mode_) { | 180 if (!nonsfi_mode_) { |
| 184 // Using nacl_helper_bootstrap is not necessary on x86-64 because | 181 // Using nacl_helper_bootstrap is not necessary on x86-64 because |
| 185 // NaCl's x86-64 sandbox is not zero-address-based. Starting | 182 // NaCl's x86-64 sandbox is not zero-address-based. Starting |
| 186 // nacl_helper through nacl_helper_bootstrap works on x86-64, but it | 183 // nacl_helper through nacl_helper_bootstrap works on x86-64, but it |
| 187 // leaves nacl_helper_bootstrap mapped at a fixed address at the | 184 // leaves nacl_helper_bootstrap mapped at a fixed address at the |
| 188 // bottom of the address space, which is undesirable because it | 185 // bottom of the address space, which is undesirable because it |
| 189 // effectively defeats ASLR. | 186 // effectively defeats ASLR. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 base::CommandLine::StringVector bootstrap_prepend; | 244 base::CommandLine::StringVector bootstrap_prepend; |
| 248 bootstrap_prepend.push_back(helper_exe.value()); | 245 bootstrap_prepend.push_back(helper_exe.value()); |
| 249 bootstrap_prepend.push_back(kNaClHelperReservedAtZero); | 246 bootstrap_prepend.push_back(kNaClHelperReservedAtZero); |
| 250 bootstrap_prepend.push_back(kNaClHelperRDebug); | 247 bootstrap_prepend.push_back(kNaClHelperRDebug); |
| 251 argv_to_launch.insert(argv_to_launch.begin() + 1, | 248 argv_to_launch.insert(argv_to_launch.begin() + 1, |
| 252 bootstrap_prepend.begin(), | 249 bootstrap_prepend.begin(), |
| 253 bootstrap_prepend.end()); | 250 bootstrap_prepend.end()); |
| 254 } | 251 } |
| 255 | 252 |
| 256 base::LaunchOptions options; | 253 base::LaunchOptions options; |
| 254 options.fds_to_remap.push_back( |
| 255 std::make_pair(fds[1], kNaClZygoteDescriptor)); |
| 256 options.fds_to_remap.push_back( |
| 257 std::make_pair(sandboxdesc, nacl_sandbox_descriptor)); |
| 257 | 258 |
| 258 base::ScopedFD dummy_fd; | 259 base::ScopedFD dummy_fd; |
| 259 if (using_setuid_sandbox) { | 260 if (using_setuid_sandbox) { |
| 260 // NaCl needs to keep tight control of the cmd_line, so prepend the | 261 // NaCl needs to keep tight control of the cmd_line, so prepend the |
| 261 // setuid sandbox wrapper manually. | 262 // setuid sandbox wrapper manually. |
| 262 base::FilePath sandbox_path = setuid_sandbox_host->GetSandboxBinaryPath(); | 263 base::FilePath sandbox_path = setuid_sandbox_host->GetSandboxBinaryPath(); |
| 263 argv_to_launch.insert(argv_to_launch.begin(), sandbox_path.value()); | 264 argv_to_launch.insert(argv_to_launch.begin(), sandbox_path.value()); |
| 264 setuid_sandbox_host->SetupLaunchOptions(&options, &fds_to_map, &dummy_fd); | 265 setuid_sandbox_host->SetupLaunchOptions(&options, &dummy_fd); |
| 265 setuid_sandbox_host->SetupLaunchEnvironment(); | 266 setuid_sandbox_host->SetupLaunchEnvironment(); |
| 266 } | 267 } |
| 267 | 268 |
| 268 options.fds_to_remap = &fds_to_map; | |
| 269 | |
| 270 // The NaCl processes spawned may need to exceed the ambient soft limit | 269 // The NaCl processes spawned may need to exceed the ambient soft limit |
| 271 // on RLIMIT_AS to allocate the untrusted address space and its guard | 270 // on RLIMIT_AS to allocate the untrusted address space and its guard |
| 272 // regions. The nacl_helper itself cannot just raise its own limit, | 271 // regions. The nacl_helper itself cannot just raise its own limit, |
| 273 // because the existing limit may prevent the initial exec of | 272 // because the existing limit may prevent the initial exec of |
| 274 // nacl_helper_bootstrap from succeeding, with its large address space | 273 // nacl_helper_bootstrap from succeeding, with its large address space |
| 275 // reservation. | 274 // reservation. |
| 276 std::vector<int> max_these_limits; | 275 std::vector<int> max_these_limits; |
| 277 max_these_limits.push_back(RLIMIT_AS); | 276 max_these_limits.push_back(RLIMIT_AS); |
| 278 options.maximize_rlimits = &max_these_limits; | 277 options.maximize_rlimits = &max_these_limits; |
| 279 | 278 |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 pass_through_vars.push_back(kNaClVerbosity); | 457 pass_through_vars.push_back(kNaClVerbosity); |
| 459 pass_through_vars.push_back(sandbox::kSandboxEnvironmentApiRequest); | 458 pass_through_vars.push_back(sandbox::kSandboxEnvironmentApiRequest); |
| 460 for (size_t i = 0; i < pass_through_vars.size(); ++i) { | 459 for (size_t i = 0; i < pass_through_vars.size(); ++i) { |
| 461 std::string temp; | 460 std::string temp; |
| 462 if (env->GetVar(pass_through_vars[i], &temp)) | 461 if (env->GetVar(pass_through_vars[i], &temp)) |
| 463 options->environ[pass_through_vars[i]] = temp; | 462 options->environ[pass_through_vars[i]] = temp; |
| 464 } | 463 } |
| 465 } | 464 } |
| 466 | 465 |
| 467 } // namespace nacl | 466 } // namespace nacl |
| OLD | NEW |