Files
sousa-gecko/ipc/app/MozillaRuntimeMain.cpp
Bob Owen 462e77cc35 Bug 2050061 p1 - Only log one message per sandbox broker. r=yjuglaret,sandbox-reviewers
This uses an RAII class to log a single message for whether the brokering was
allowed or blocked.
This removes the console logging. This was only originally added for old style
extensions. They could override most firefox code and could cause violations.
CallNtOpenProcessTokenEx loses its log calls with no SYSCALL_BROKERING
replacement. The token ACL now retains the user's own SID plus the sandbox
random SID so both normal and restricted checks pass anyway. Threading the
macros through this non-Target* helper isn't worth it.
It also removes the stack trace logging, this is now difficult to get working
in strong sandboxes and will be replaced by profiler markers.

Differential Revision: https://phabricator.services.mozilla.com/D309372
2026-07-10 10:11:36 +00:00

100 lines
3.1 KiB
C++

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsXULAppAPI.h"
#include "XREChildData.h"
#include "mozilla/Bootstrap.h"
#include "mozilla/ProcessType.h"
#include "mozilla/RuntimeExceptionModule.h"
#include "mozilla/ScopeExit.h"
#if defined(XP_WIN)
# include "mozilla/WindowsDllBlocklist.h"
# include "mozilla/GeckoArgs.h"
# include "nsWindowsWMain.cpp"
# ifdef MOZ_SANDBOX
# include "mozilla/sandboxing/SandboxInitialization.h"
# include "mozilla/sandboxing/TargetGeckoServices.h"
# endif
#endif // defined(XP_WIN)
using namespace mozilla;
int main(int argc, char* argv[]) {
// Set the process type and gecko child id.
if (argc < 2) {
return 3;
}
SetGeckoProcessType(argv[--argc]);
SetGeckoChildID(argv[--argc]);
auto bootstrapResult = GetBootstrap();
if (bootstrapResult.isErr()) {
return 2;
}
Bootstrap::UniquePtr bootstrap = bootstrapResult.unwrap();
#if defined(MOZ_ENABLE_FORKSERVER)
if (GetGeckoProcessType() == GeckoProcessType_ForkServer) {
bootstrap->NS_LogInit();
// Run a fork server in this process, single thread. When it returns, it
// means the fork server have been stopped or a new child process is
// created.
//
// For the latter case, XRE_ForkServer() will return false, running in a
// child process just forked from the fork server process. argc & argv will
// be updated with the values passing from the chrome process, as will
// GeckoProcessType and GeckoChildID. With the new values, this function
// continues the reset of the code acting as a child process.
if (bootstrap->XRE_ForkServer(&argc, &argv)) {
// Return from the fork server in the fork server process.
// Stop the fork server.
bootstrap->NS_LogTerm();
return 0;
}
}
#endif
// Register an external module to report on otherwise uncatchable
// exceptions. Note that in child processes this must be called after Gecko
// process type has been set.
CrashReporter::RegisterRuntimeExceptionModule();
// Make sure we unregister the runtime exception module before returning.
auto unregisterRuntimeExceptionModule =
MakeScopeExit([] { CrashReporter::UnregisterRuntimeExceptionModule(); });
#ifdef HAS_DLL_BLOCKLIST
uint32_t initFlags = eDllBlocklistInitFlagIsChildProcess;
SetDllBlocklistProcessTypeFlags(initFlags, GetGeckoProcessType());
DllBlocklist_Initialize(initFlags);
#endif
XREChildData childData;
#if defined(XP_WIN) && defined(MOZ_SANDBOX)
if (IsSandboxedProcess()) {
childData.sandboxTargetServices =
mozilla::sandboxing::GetInitializedTargetServices();
if (!childData.sandboxTargetServices) {
return 1;
}
childData.setTargetGeckoServices =
mozilla::sandboxing::SetTargetGeckoServices;
}
#endif
nsresult rv = bootstrap->XRE_InitChildProcess(argc, argv, &childData);
#if defined(DEBUG) && defined(HAS_DLL_BLOCKLIST)
DllBlocklist_Shutdown();
#endif
return NS_FAILED(rv) ? 1 : 0;
}