Skip to content

Commit 20dc0b3

Browse files
happyCoder92copybara-github
authored andcommitted
Add DisableCompressStackDepot workaround also for global forkserver/stack tracing
PiperOrigin-RevId: 819837412 Change-Id: I1fad66d9d36f462286c54c61145b0c8c444e7138
1 parent 6a564c7 commit 20dc0b3

File tree

5 files changed

+60
-47
lines changed

5 files changed

+60
-47
lines changed

sandboxed_api/sandbox2/BUILD

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ cc_library(
277277
"//sandboxed_api:embed_file",
278278
"//sandboxed_api/util:fileops",
279279
"//sandboxed_api/util:raw_logging",
280-
"//sandboxed_api/util:status",
280+
"@abseil-cpp//absl/algorithm:container",
281281
"@abseil-cpp//absl/base:core_headers",
282282
"@abseil-cpp//absl/cleanup",
283283
"@abseil-cpp//absl/flags:flag",
@@ -286,6 +286,7 @@ cc_library(
286286
"@abseil-cpp//absl/status:statusor",
287287
"@abseil-cpp//absl/strings",
288288
"@abseil-cpp//absl/synchronization",
289+
"@com_google_protobuf//:protobuf",
289290
],
290291
)
291292

@@ -316,7 +317,6 @@ cc_library(
316317
":limits",
317318
":namespace",
318319
":util",
319-
"//sandboxed_api:config",
320320
"//sandboxed_api/util:fileops",
321321
"@abseil-cpp//absl/base:core_headers",
322322
"@abseil-cpp//absl/log",

sandboxed_api/sandbox2/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -242,13 +242,15 @@ add_library(sandbox2_global_forkserver ${SAPI_LIB_TYPE}
242242
)
243243
add_library(sandbox2::global_forkserver ALIAS sandbox2_global_forkserver)
244244
target_link_libraries(sandbox2_global_forkserver
245-
PRIVATE absl::cleanup
245+
PRIVATE absl::algorithm_container
246+
absl::cleanup
246247
absl::strings
247248
absl::status
248249
absl::statusor
249250
absl::log
250251
sandbox2::client
251252
sandbox2::flags
253+
sandbox2::forkserver
252254
sandbox2::forkserver_bin_embed
253255
sandbox2::util
254256
sapi::strerror
@@ -257,7 +259,6 @@ target_link_libraries(sandbox2_global_forkserver
257259
sapi::embed_file
258260
sapi::fileops
259261
sapi::raw_logging
260-
sapi::status
261262
PUBLIC absl::core_headers
262263
absl::flags
263264
absl::synchronization
@@ -301,7 +302,6 @@ target_link_libraries(sandbox2_executor
301302
absl::span
302303
absl::statusor
303304
absl::strings
304-
sapi::config
305305
sapi::fileops
306306
sapi::status
307307
sandbox2::fork_client

sandboxed_api/sandbox2/executor.cc

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
#include <sys/socket.h>
2121
#include <unistd.h>
2222

23-
#include <algorithm>
2423
#include <cerrno>
2524
#include <cstdint>
2625
#include <memory>
@@ -30,10 +29,8 @@
3029
#include "absl/log/log.h"
3130
#include "absl/status/status.h"
3231
#include "absl/status/statusor.h"
33-
#include "absl/strings/match.h"
3432
#include "absl/strings/str_cat.h"
3533
#include "absl/strings/string_view.h"
36-
#include "sandboxed_api/config.h"
3734
#include "sandboxed_api/sandbox2/fork_client.h"
3835
#include "sandboxed_api/sandbox2/forkserver.pb.h"
3936
#include "sandboxed_api/sandbox2/global_forkclient.h"
@@ -46,41 +43,6 @@ namespace sandbox2 {
4643

4744
namespace file_util = ::sapi::file_util;
4845

49-
namespace {
50-
void DisableCompressStackDepot(ForkRequest& request) {
51-
auto disable_compress_stack_depot = [&request](absl::string_view sanitizer) {
52-
auto prefix = absl::StrCat(sanitizer, "_OPTIONS=");
53-
auto it = std::find_if(request.mutable_envs()->begin(),
54-
request.mutable_envs()->end(),
55-
[&prefix](const std::string& env) {
56-
return absl::StartsWith(env, prefix);
57-
});
58-
constexpr absl::string_view option = "compress_stack_depot=0";
59-
if (it != request.mutable_envs()->end()) {
60-
// If it's already there, the last value will be used.
61-
absl::StrAppend(&*it, ":", option);
62-
return;
63-
}
64-
request.add_envs(absl::StrCat(prefix, option));
65-
};
66-
if constexpr (sapi::sanitizers::IsASan()) {
67-
disable_compress_stack_depot("ASAN");
68-
}
69-
if constexpr (sapi::sanitizers::IsMSan()) {
70-
disable_compress_stack_depot("MSAN");
71-
}
72-
if constexpr (sapi::sanitizers::IsLSan()) {
73-
disable_compress_stack_depot("LSAN");
74-
}
75-
if constexpr (sapi::sanitizers::IsHwASan()) {
76-
disable_compress_stack_depot("HWSAN");
77-
}
78-
if constexpr (sapi::sanitizers::IsTSan()) {
79-
disable_compress_stack_depot("TSAN");
80-
}
81-
}
82-
} // namespace
83-
8446
std::vector<std::string> Executor::CopyEnviron() {
8547
return util::CharPtrArray(environ).ToStringVector();
8648
}
@@ -123,9 +85,7 @@ absl::StatusOr<SandboxeeProcess> Executor::StartSubProcess(
12385
}
12486

12587
// Disable optimization to avoid related syscalls.
126-
if constexpr (sapi::sanitizers::IsAny()) {
127-
DisableCompressStackDepot(request);
128-
}
88+
DisableCompressStackDepot(request.mutable_envs());
12989

13090
// If neither the path, nor exec_fd is specified, just assume that we need to
13191
// send a fork request.

sandboxed_api/sandbox2/global_forkclient.cc

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,16 @@
2727
#include <cstdlib>
2828
#include <memory>
2929
#include <string>
30+
#include <vector>
3031

32+
#include "absl/algorithm/container.h"
3133
#include "absl/base/const_init.h"
3234
#include "absl/cleanup/cleanup.h"
3335
#include "absl/flags/flag.h"
3436
#include "absl/log/log.h"
3537
#include "absl/status/status.h"
3638
#include "absl/status/statusor.h"
39+
#include "absl/strings/match.h"
3740
#include "absl/strings/str_cat.h"
3841
#include "absl/strings/string_view.h"
3942
#include "absl/synchronization/mutex.h"
@@ -59,8 +62,42 @@ GlobalForkserverStartModeSet GetForkserverStartMode() {
5962
struct ForkserverArgs {
6063
int exec_fd;
6164
int comms_fd;
65+
const char* const* envp;
6266
};
6367

68+
template <typename C, typename AddFn>
69+
void DisableCompressStackDepotImpl(C& envs, AddFn&& add_env) {
70+
auto disable_compress_stack_depot = [&envs,
71+
&add_env](absl::string_view sanitizer) {
72+
auto prefix = absl::StrCat(sanitizer, "_OPTIONS=");
73+
constexpr absl::string_view option = "compress_stack_depot=0";
74+
auto it = absl::c_find_if(envs, [&prefix](const std::string& env) {
75+
return absl::StartsWith(env, prefix);
76+
});
77+
if (it != envs.end()) {
78+
// If it's already there, the last value will be used.
79+
absl::StrAppend(&*it, ":", option);
80+
return;
81+
}
82+
add_env(absl::StrCat(prefix, option));
83+
};
84+
if constexpr (sapi::sanitizers::IsASan()) {
85+
disable_compress_stack_depot("ASAN");
86+
}
87+
if constexpr (sapi::sanitizers::IsMSan()) {
88+
disable_compress_stack_depot("MSAN");
89+
}
90+
if constexpr (sapi::sanitizers::IsLSan()) {
91+
disable_compress_stack_depot("LSAN");
92+
}
93+
if constexpr (sapi::sanitizers::IsHwASan()) {
94+
disable_compress_stack_depot("HWSAN");
95+
}
96+
if constexpr (sapi::sanitizers::IsTSan()) {
97+
disable_compress_stack_depot("TSAN");
98+
}
99+
}
100+
64101
int LaunchForkserver(void* vargs) {
65102
auto* args = static_cast<ForkserverArgs*>(vargs);
66103
// Move the comms FD to the proper, expected FD number.
@@ -78,7 +115,7 @@ int LaunchForkserver(void* vargs) {
78115

79116
char proc_name[] = "S2-FORK-SERV";
80117
char* const argv[] = {proc_name, nullptr};
81-
util::Execveat(args->exec_fd, "", argv, environ, AT_EMPTY_PATH);
118+
util::Execveat(args->exec_fd, "", argv, args->envp, AT_EMPTY_PATH);
82119
SAPI_RAW_PLOG(FATAL, "Could not launch forkserver binary");
83120
}
84121

@@ -128,9 +165,15 @@ absl::StatusOr<std::unique_ptr<GlobalForkClient>> StartGlobalForkServer() {
128165
absl::Cleanup stack_dealloc = [stack, stack_size] {
129166
munmap(stack, stack_size);
130167
};
168+
std::vector<std::string> env = util::CharPtrArray(environ).ToStringVector();
169+
DisableCompressStackDepotImpl(env, [&env](absl::string_view value) {
170+
env.push_back(std::string(value));
171+
});
172+
util::CharPtrArray envp = util::CharPtrArray::FromStringVector(env);
131173
ForkserverArgs args = {
132174
.exec_fd = exec_fd,
133175
.comms_fd = sv[0],
176+
.envp = envp.data(),
134177
};
135178
pid_t pid = clone(LaunchForkserver, &stack[stack_size], clone_flags, &args,
136179
nullptr, nullptr, nullptr);
@@ -167,6 +210,11 @@ void WaitForForkserver(pid_t pid) {
167210
absl::Mutex GlobalForkClient::instance_mutex_(absl::kConstInit);
168211
GlobalForkClient* GlobalForkClient::instance_ = nullptr;
169212

213+
void DisableCompressStackDepot(google::protobuf::RepeatedPtrField<std::string>* envs) {
214+
DisableCompressStackDepotImpl(
215+
*envs, [&envs](absl::string_view env) { envs->Add(std::string(env)); });
216+
}
217+
170218
void GlobalForkClient::EnsureStarted(GlobalForkserverStartMode mode) {
171219
absl::MutexLock lock(&instance_mutex_);
172220
EnsureStartedLocked(mode);

sandboxed_api/sandbox2/global_forkclient.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,20 @@
2020

2121
#include <sys/types.h>
2222

23+
#include <string>
24+
2325
#include "absl/base/thread_annotations.h"
2426
#include "absl/synchronization/mutex.h"
27+
#include "google/protobuf/repeated_ptr_field.h"
2528
#include "sandboxed_api/sandbox2/comms.h"
2629
#include "sandboxed_api/sandbox2/flags.h" // IWYU pragma: export
2730
#include "sandboxed_api/sandbox2/fork_client.h"
2831
#include "sandboxed_api/sandbox2/forkserver.pb.h"
2932

3033
namespace sandbox2 {
3134

35+
void DisableCompressStackDepot(google::protobuf::RepeatedPtrField<std::string>* envs);
36+
3237
class GlobalForkClient {
3338
public:
3439
GlobalForkClient(int fd, pid_t pid)

0 commit comments

Comments
 (0)