================
@@ -264,8 +265,10 @@ int clang_main(int Argc, char **Argv, const 
llvm::ToolContext &ToolContext) {
   }
 
   // Handle -cc1 integrated tools.
-  if (Args.size() >= 2 && StringRef(Args[1]).starts_with("-cc1"))
+  if (Args.size() >= 2 && StringRef(Args[1]).starts_with("-cc1")) {
+    auto EnableSandbox = llvm::sys::sandbox::scopedEnable();
----------------
jansvoboda11 wrote:

You're raising a valid point. I looked into this more closely and there seem to 
be 5 ways `cc1_main()` can be reached.

1. `clang -cc1 -emit-obj` - frontend invocation,
2. `clang -fintegrated-cc1 -c` - driver invocation with integrated -cc1 and 
single job,
3. `clang -fintegrated-cc1` - driver invocation with integrated -cc1 and 
multiple jobs,
4. `clang -fno-integrated-cc1 -c` - driver invocation without integrated -cc1 
and single job,
5. `clang -fino-ntegrated-cc1` - driver invocation without integrated -cc1 and 
multiple jobs.

---

This PR clearly handles case (1):
* `clang_main()`
* `ExecuteCC1Tool()`
* `cc1_main()`

---

The original PR [#165350](https://github.com/llvm/llvm-project/pull/165350) 
handled case (2):
   * `clang_main()`
   * `Driver::ExecuteCompilation()`
   * ...
   * `CC1Command::Execute()`

The original PR enabled the sandbox in `CC1Command::Execute()` which is reached 
like so:

https://github.com/llvm/llvm-project/blob/52f85b0159d7f9cd3f21d644e92684afc53f0ed1/clang/tools/driver/driver.cpp#L371-L372

https://github.com/llvm/llvm-project/blob/52f85b0159d7f9cd3f21d644e92684afc53f0ed1/clang/lib/Driver/ToolChains/Clang.cpp#L7985-L7989

https://github.com/llvm/llvm-project/blob/52f85b0159d7f9cd3f21d644e92684afc53f0ed1/clang/lib/Driver/Job.cpp#L432

---

Interestingly, in case (3), with multiple jobs generated by the driver, this 
code:

https://github.com/llvm/llvm-project/blob/52f85b0159d7f9cd3f21d644e92684afc53f0ed1/clang/lib/Driver/Driver.cpp#L5348-L5352

makes `CC1Command` forward to the regular (out-of-process) `Command`:

https://github.com/llvm/llvm-project/blob/52f85b0159d7f9cd3f21d644e92684afc53f0ed1/clang/lib/Driver/Job.cpp#L410-L414

This means the new `-cc1` process will go down the path this PR handles and the 
sandbox will be enabled.

---

The same thing then happens in cases (4) and (5), without integrated `-cc1`, 
where this branch is not entered:

https://github.com/llvm/llvm-project/blob/52f85b0159d7f9cd3f21d644e92684afc53f0ed1/clang/tools/driver/driver.cpp#L371-L372

and then Clang creates a plain `Command` instead of `CC1Command`:

https://github.com/llvm/llvm-project/blob/52f85b0159d7f9cd3f21d644e92684afc53f0ed1/clang/lib/Driver/ToolChains/Clang.cpp#L7990-L7994

and again, the new `-cc1` process will go down the path handled in this PR.

---

So I believe this PR makes sandboxing of `-cc1` commands work as intended, but 
maybe in a somewhat convoluted way. I think a simpler way to reliably enable 
sandbox for `cc1_main()` might be to do so right at the start of `cc1_main()` 
itself, regardless of how it was reached. However, I think this call to 
`scopedEnable()`:

https://github.com/llvm/llvm-project/blob/52f85b0159d7f9cd3f21d644e92684afc53f0ed1/clang/lib/Driver/Job.cpp#L430-L432

is still necessary, so that in case `cc1_main()` crashes and doesn't get a 
chance to restore the original sandbox setting itself in case (2), the sandbox 
is not unintentionally left enabled for the rest of the driver process. (But 
maybe we should consider moving the "restore previous sandbox setting" logic 
into `llvm::CrashRecoveryContext` that gets used for this case?)

Let me know what you think @benlangmuir.

https://github.com/llvm/llvm-project/pull/174653
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to