Skip to content

Commit d528023

Browse files
Sandboxed API Teamcopybara-github
authored andcommitted
Automated rollback of commit 86155ba.
PiperOrigin-RevId: 811777386 Change-Id: I8137a57e9e6838a0feed46d84d2cdce8cc60720b
1 parent 8316e0a commit d528023

6 files changed

Lines changed: 48 additions & 64 deletions

File tree

sandboxed_api/sandbox2/BUILD

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,14 +270,14 @@ cc_library(
270270
":comms",
271271
":flags",
272272
":fork_client",
273-
":forkserver",
274273
":forkserver_bin_embed",
275274
":forkserver_cc_proto",
276275
":util",
277276
"//sandboxed_api:config",
278277
"//sandboxed_api:embed_file",
279278
"//sandboxed_api/util:fileops",
280279
"//sandboxed_api/util:raw_logging",
280+
"//sandboxed_api/util:status",
281281
"@abseil-cpp//absl/base:core_headers",
282282
"@abseil-cpp//absl/cleanup",
283283
"@abseil-cpp//absl/flags:flag",
@@ -316,6 +316,7 @@ cc_library(
316316
":limits",
317317
":namespace",
318318
":util",
319+
"//sandboxed_api:config",
319320
"//sandboxed_api/util:fileops",
320321
"@abseil-cpp//absl/base:core_headers",
321322
"@abseil-cpp//absl/log",
@@ -638,7 +639,6 @@ cc_library(
638639
"//sandboxed_api/util:fileops",
639640
"//sandboxed_api/util:raw_logging",
640641
"//sandboxed_api/util:strerror",
641-
"@abseil-cpp//absl/algorithm:container",
642642
"@abseil-cpp//absl/base:core_headers",
643643
"@abseil-cpp//absl/container:flat_hash_map",
644644
"@abseil-cpp//absl/container:flat_hash_set",

sandboxed_api/sandbox2/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,6 @@ target_link_libraries(sandbox2_global_forkserver
249249
absl::log
250250
sandbox2::client
251251
sandbox2::flags
252-
sandbox2::forkserver
253252
sandbox2::forkserver_bin_embed
254253
sandbox2::util
255254
sapi::strerror
@@ -258,6 +257,7 @@ target_link_libraries(sandbox2_global_forkserver
258257
sapi::embed_file
259258
sapi::fileops
260259
sapi::raw_logging
260+
sapi::status
261261
PUBLIC absl::core_headers
262262
absl::flags
263263
absl::synchronization
@@ -301,6 +301,7 @@ target_link_libraries(sandbox2_executor
301301
absl::span
302302
absl::statusor
303303
absl::strings
304+
sapi::config
304305
sapi::fileops
305306
sapi::status
306307
sandbox2::fork_client
@@ -594,8 +595,7 @@ add_library(sandbox2_forkserver ${SAPI_LIB_TYPE}
594595
)
595596
add_library(sandbox2::forkserver ALIAS sandbox2_forkserver)
596597
target_link_libraries(sandbox2_forkserver
597-
PRIVATE absl::algorithm_container
598-
absl::flat_hash_map
598+
PRIVATE absl::flat_hash_map
599599
absl::flat_hash_set
600600
absl::status
601601
absl::statusor

sandboxed_api/sandbox2/executor.cc

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

23+
#include <algorithm>
2324
#include <cerrno>
2425
#include <cstdint>
2526
#include <memory>
@@ -29,8 +30,10 @@
2930
#include "absl/log/log.h"
3031
#include "absl/status/status.h"
3132
#include "absl/status/statusor.h"
33+
#include "absl/strings/match.h"
3234
#include "absl/strings/str_cat.h"
3335
#include "absl/strings/string_view.h"
36+
#include "sandboxed_api/config.h"
3437
#include "sandboxed_api/sandbox2/fork_client.h"
3538
#include "sandboxed_api/sandbox2/forkserver.pb.h"
3639
#include "sandboxed_api/sandbox2/global_forkclient.h"
@@ -43,7 +46,40 @@ namespace sandbox2 {
4346

4447
namespace file_util = ::sapi::file_util;
4548

46-
namespace {} // namespace
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
4783

4884
std::vector<std::string> Executor::CopyEnviron() {
4985
return util::CharPtrArray(environ).ToStringVector();
@@ -86,6 +122,11 @@ absl::StatusOr<SandboxeeProcess> Executor::StartSubProcess(
86122
file_util::fileops::StripBasename(path_)));
87123
}
88124

125+
// Disable optimization to avoid related syscalls.
126+
if constexpr (sapi::sanitizers::IsAny()) {
127+
DisableCompressStackDepot(request);
128+
}
129+
89130
// If neither the path, nor exec_fd is specified, just assume that we need to
90131
// send a fork request.
91132
//

sandboxed_api/sandbox2/forkserver.cc

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
#include <utility>
4141
#include <vector>
4242

43-
#include "absl/algorithm/container.h"
4443
#include "absl/base/attributes.h"
4544
#include "absl/container/flat_hash_map.h"
4645
#include "absl/container/flat_hash_set.h"
@@ -263,39 +262,6 @@ bool IsLikelyChrooted() {
263262
return *self_root_id != *init_root_id;
264263
}
265264

266-
template <typename C, typename AddFn>
267-
void DisableCompressStackDepotImpl(C& envs, AddFn&& add_env) {
268-
auto disable_compress_stack_depot = [&envs,
269-
&add_env](absl::string_view sanitizer) {
270-
auto prefix = absl::StrCat(sanitizer, "_OPTIONS=");
271-
constexpr absl::string_view option = "compress_stack_depot=0";
272-
auto it = absl::c_find_if(envs, [&prefix](const std::string& env) {
273-
return absl::StartsWith(env, prefix);
274-
});
275-
if (it != envs.end()) {
276-
// If it's already there, the last value will be used.
277-
absl::StrAppend(&*it, ":", option);
278-
return;
279-
}
280-
add_env(absl::StrCat(prefix, option));
281-
};
282-
if constexpr (sapi::sanitizers::IsASan()) {
283-
disable_compress_stack_depot("ASAN");
284-
}
285-
if constexpr (sapi::sanitizers::IsMSan()) {
286-
disable_compress_stack_depot("MSAN");
287-
}
288-
if constexpr (sapi::sanitizers::IsLSan()) {
289-
disable_compress_stack_depot("LSAN");
290-
}
291-
if constexpr (sapi::sanitizers::IsHwASan()) {
292-
disable_compress_stack_depot("HWSAN");
293-
}
294-
if constexpr (sapi::sanitizers::IsTSan()) {
295-
disable_compress_stack_depot("TSAN");
296-
}
297-
}
298-
299265
} // namespace
300266

301267
void ForkServer::PrepareExecveArgs(const ForkRequest& request,
@@ -325,12 +291,6 @@ void ForkServer::PrepareExecveArgs(const ForkRequest& request,
325291
absl::StrJoin(*envp, "', '").c_str());
326292
}
327293

328-
void ForkServer::DisableCompressStackDepot(std::vector<std::string>& envs) {
329-
DisableCompressStackDepotImpl(envs, [&envs](absl::string_view value) {
330-
envs.push_back(std::string(value));
331-
});
332-
}
333-
334294
void ForkServer::LaunchChild(const ForkRequest& request, int execve_fd,
335295
uid_t uid, gid_t gid, FDCloser signaling_fd,
336296
FDCloser status_fd, bool avoid_pivot_root) const {
@@ -448,14 +408,6 @@ pid_t ForkServer::ServeRequest() {
448408
SAPI_RAW_CHECK(comms_->RecvFD(&exec_fd), "Failed to receive Exec FD");
449409
}
450410

451-
// Disable optimization to avoid related syscalls.
452-
if constexpr (sapi::sanitizers::IsAny()) {
453-
DisableCompressStackDepotImpl(*fork_request.mutable_envs(),
454-
[&fork_request](absl::string_view value) {
455-
fork_request.add_envs(value);
456-
});
457-
}
458-
459411
// Make the kernel notify us with SIGCHLD when the process terminates.
460412
// We use sigaction(SIGCHLD, flags=SA_NOCLDWAIT) in combination with
461413
// this to make sure the zombie process is reaped immediately.

sandboxed_api/sandbox2/forkserver.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ class ForkServer {
5252
// Returns values defined as with fork() (-1 means error).
5353
pid_t ServeRequest();
5454

55-
static void DisableCompressStackDepot(std::vector<std::string>& envs);
56-
5755
private:
5856
// Creates and launched the child process.
5957
void LaunchChild(const ForkRequest& request, int execve_fd, uid_t uid,

sandboxed_api/sandbox2/global_forkclient.cc

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
#include <cstdlib>
2828
#include <memory>
2929
#include <string>
30-
#include <vector>
3130

3231
#include "absl/base/const_init.h"
3332
#include "absl/cleanup/cleanup.h"
@@ -42,7 +41,6 @@
4241
#include "sandboxed_api/embed_file.h"
4342
#include "sandboxed_api/sandbox2/comms.h"
4443
#include "sandboxed_api/sandbox2/fork_client.h"
45-
#include "sandboxed_api/sandbox2/forkserver.h"
4644
#include "sandboxed_api/sandbox2/forkserver_bin_embed.h"
4745
#include "sandboxed_api/sandbox2/util.h"
4846
#include "sandboxed_api/util/fileops.h"
@@ -61,7 +59,6 @@ GlobalForkserverStartModeSet GetForkserverStartMode() {
6159
struct ForkserverArgs {
6260
int exec_fd;
6361
int comms_fd;
64-
const char* const* envp;
6562
};
6663

6764
int LaunchForkserver(void* vargs) {
@@ -81,7 +78,7 @@ int LaunchForkserver(void* vargs) {
8178

8279
char proc_name[] = "S2-FORK-SERV";
8380
char* const argv[] = {proc_name, nullptr};
84-
util::Execveat(args->exec_fd, "", argv, args->envp, AT_EMPTY_PATH);
81+
util::Execveat(args->exec_fd, "", argv, environ, AT_EMPTY_PATH);
8582
SAPI_RAW_PLOG(FATAL, "Could not launch forkserver binary");
8683
}
8784

@@ -131,13 +128,9 @@ absl::StatusOr<std::unique_ptr<GlobalForkClient>> StartGlobalForkServer() {
131128
absl::Cleanup stack_dealloc = [stack, stack_size] {
132129
munmap(stack, stack_size);
133130
};
134-
std::vector<std::string> env = util::CharPtrArray(environ).ToStringVector();
135-
ForkServer::DisableCompressStackDepot(env);
136-
util::CharPtrArray envp = util::CharPtrArray::FromStringVector(env);
137131
ForkserverArgs args = {
138132
.exec_fd = exec_fd,
139133
.comms_fd = sv[0],
140-
.envp = envp.data(),
141134
};
142135
pid_t pid = clone(LaunchForkserver, &stack[stack_size], clone_flags, &args,
143136
nullptr, nullptr, nullptr);

0 commit comments

Comments
 (0)