Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7091)

Unified Diff: chrome/browser/zygote_main_linux.cc

Issue 203071: Linux: add support for SELinux. (Closed)
Patch Set: Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « build/linux/system.gyp ('k') | chrome/chrome.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/zygote_main_linux.cc
diff --git a/chrome/browser/zygote_main_linux.cc b/chrome/browser/zygote_main_linux.cc
index ac9067f4180f6f898e8ab0a2777daf645659d52a..2a2a9e5b612cb7f3e5864314095c34fad4fc8a46 100644
--- a/chrome/browser/zygote_main_linux.cc
+++ b/chrome/browser/zygote_main_linux.cc
@@ -32,6 +32,11 @@
#include "skia/ext/SkFontHost_fontconfig_control.h"
+#if defined(CHROMIUM_SELINUX)
+#include <selinux/selinux.h>
+#include <selinux/context.h>
+#endif
+
// http://code.google.com/p/chromium/wiki/LinuxZygote
static const int kMagicSandboxIPCDescriptor = 5;
@@ -207,6 +212,10 @@ class Zygote {
}
};
+// With SELinux we can carve out a precise sandbox, so we don't have to play
+// with intercepting libc calls.
+#ifndef CHROMIUM_SELINUX
Evan Martin 2009/09/15 18:45:51 if !defined(
+
static void ProxyLocaltimeCallToBrowser(time_t input, struct tm* output,
char* timezone_out,
size_t timezone_out_len) {
@@ -351,22 +360,11 @@ static void WarnOnceAboutBrokenDlsym() {
have_shown_warning = true;
}
}
+#endif // !CHROMIUM_SELINUX
-static bool MaybeEnterChroot() {
- const char* const sandbox_fd_string = getenv("SBX_D");
- if (sandbox_fd_string) {
- // The SUID sandbox sets this environment variable to a file descriptor
- // over which we can signal that we have completed our startup and can be
- // chrooted.
-
- char* endptr;
- const long fd_long = strtol(sandbox_fd_string, &endptr, 10);
- if (!*sandbox_fd_string || *endptr || fd_long < 0 || fd_long > INT_MAX)
- return false;
- const int fd = fd_long;
-
- // Before entering the sandbox, "prime" any systems that need to open
- // files and cache the results or the descriptors.
+// This function trigger the static and lazy construction of objects that need
Evan Martin 2009/09/15 18:45:51 triggers
+// to be created before imposing the sandbox.
+static void PreSandboxInit() {
base::RandUint64();
base::SysInfo::MaxSharedMemorySize();
@@ -382,6 +380,23 @@ static bool MaybeEnterChroot() {
FilePath module_path;
if (PathService::Get(base::DIR_MODULE, &module_path))
media::InitializeMediaLibrary(module_path);
+}
+
+#if !defined(CHROMIUM_SELINUX)
+static bool EnterSandbox() {
+ const char* const sandbox_fd_string = getenv("SBX_D");
+ if (sandbox_fd_string) {
+ // The SUID sandbox sets this environment variable to a file descriptor
+ // over which we can signal that we have completed our startup and can be
+ // chrooted.
+
+ char* endptr;
+ const long fd_long = strtol(sandbox_fd_string, &endptr, 10);
+ if (!*sandbox_fd_string || *endptr || fd_long < 0 || fd_long > INT_MAX)
+ return false;
+ const int fd = fd_long;
+
+ PreSandboxInit();
static const char kChrootMe = 'C';
static const char kChrootMeSuccess = 'O';
@@ -438,11 +453,40 @@ static bool MaybeEnterChroot() {
return true;
}
+#else // !CHROMIUM_SELINUX
Evan Martin 2009/09/15 18:45:51 it might be less confusing to remove the ! here, s
+
+static bool EnterSandbox() {
+ PreSandboxInit();
+ SkiaFontConfigUseIPCImplementation(kMagicSandboxIPCDescriptor);
+
+ security_context_t security_context;
+ if (getcon(&security_context)) {
+ LOG(ERROR) << "Cannot get SELinux context";
+ return false;
+ }
+
+ context_t context = context_new(security_context);
+ context_type_set(context, "chromium_renderer_t");
+ const int r = setcon(context_str(context));
+ context_free(context);
+ freecon(security_context);
+
+ if (r) {
+ LOG(ERROR) << "dyntrans failed to type 'chromium_renderer_t'";
Evan Martin 2009/09/15 18:45:51 Is dyntrans a term selinux people would understand
+ return false;
+ }
+
+ return true;
+}
+
+#endif // CHROMIUM_SELINUX
bool ZygoteMain(const MainFunctionParams& params) {
+#if !defined(CHROMIUM_SELINUX)
Evan Martin 2009/09/15 18:45:51 why is this necessary?
g_am_zygote_or_renderer = true;
+#endif
- if (!MaybeEnterChroot()) {
+ if (!EnterSandbox()) {
LOG(FATAL) << "Failed to enter sandbox. Fail safe abort. (errno: "
<< errno << ")";
return false;
« no previous file with comments | « build/linux/system.gyp ('k') | chrome/chrome.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698