2002-08-21 23:21:36 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* 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/. */
|
2002-08-21 23:21:36 +04:00
|
|
|
|
2012-02-22 11:12:15 +04:00
|
|
|
#include "nsXULAppAPI.h"
|
2013-01-03 19:04:42 +04:00
|
|
|
#include "mozilla/AppData.h"
|
2011-11-22 11:05:59 +04:00
|
|
|
#include "application.ini.h"
|
2011-05-22 10:23:20 +04:00
|
|
|
#include "nsXPCOMGlue.h"
|
2011-05-22 10:24:32 +04:00
|
|
|
#if defined(XP_WIN)
|
2002-08-21 23:21:36 +04:00
|
|
|
#include <windows.h>
|
2004-06-18 01:23:51 +04:00
|
|
|
#include <stdlib.h>
|
2011-05-22 10:24:32 +04:00
|
|
|
#elif defined(XP_UNIX)
|
|
|
|
#include <sys/resource.h>
|
2013-01-03 19:04:42 +04:00
|
|
|
#include <unistd.h>
|
2002-08-21 23:21:36 +04:00
|
|
|
#endif
|
2004-06-18 01:23:51 +04:00
|
|
|
|
2007-07-02 22:20:24 +04:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdarg.h>
|
2012-06-16 21:44:07 +04:00
|
|
|
#include <time.h>
|
2007-07-26 00:24:37 +04:00
|
|
|
|
2007-07-02 22:20:24 +04:00
|
|
|
#include "nsCOMPtr.h"
|
2012-06-06 06:08:30 +04:00
|
|
|
#include "nsIFile.h"
|
2007-07-02 22:20:24 +04:00
|
|
|
#include "nsStringGlue.h"
|
|
|
|
|
2007-12-31 18:15:43 +03:00
|
|
|
#ifdef XP_WIN
|
2014-11-24 21:42:33 +03:00
|
|
|
#ifdef MOZ_ASAN
|
|
|
|
// ASAN requires firefox.exe to be built with -MD, and it's OK if we don't
|
|
|
|
// support Windows XP SP2 in ASAN builds.
|
|
|
|
#define XRE_DONT_SUPPORT_XPSP2
|
|
|
|
#endif
|
2015-11-19 09:31:44 +03:00
|
|
|
#define XRE_WANT_ENVIRON
|
2011-05-22 10:23:20 +04:00
|
|
|
#define strcasecmp _stricmp
|
2016-05-15 18:41:40 +03:00
|
|
|
#ifdef MOZ_SANDBOX
|
|
|
|
#include "mozilla/sandboxing/SandboxInitialization.h"
|
|
|
|
#endif
|
2007-12-31 18:15:43 +03:00
|
|
|
#endif
|
2011-05-22 10:23:20 +04:00
|
|
|
#include "BinaryPath.h"
|
|
|
|
|
|
|
|
#include "nsXPCOMPrivate.h" // for MAXPATHLEN and XPCOM_DLL
|
2007-12-31 18:15:43 +03:00
|
|
|
|
2016-10-04 18:57:51 +03:00
|
|
|
#include "mozilla/Sprintf.h"
|
2011-05-22 10:24:32 +04:00
|
|
|
#include "mozilla/Telemetry.h"
|
2013-11-12 17:31:32 +04:00
|
|
|
#include "mozilla/WindowsDllBlocklist.h"
|
2011-05-22 10:24:32 +04:00
|
|
|
|
2016-06-03 22:49:39 +03:00
|
|
|
#if !defined(MOZ_WIDGET_COCOA) && !defined(MOZ_WIDGET_ANDROID) \
|
|
|
|
&& !(defined(XP_LINUX) && defined(MOZ_SANDBOX))
|
|
|
|
#define MOZ_BROWSER_CAN_BE_CONTENTPROC
|
|
|
|
#include "../../ipc/contentproc/plugin-container.cpp"
|
|
|
|
#endif
|
|
|
|
|
2013-01-03 19:04:42 +04:00
|
|
|
using namespace mozilla;
|
|
|
|
|
2014-09-29 22:51:04 +04:00
|
|
|
#ifdef XP_MACOSX
|
|
|
|
#define kOSXResourcesFolder "Resources"
|
|
|
|
#endif
|
2013-02-13 00:51:24 +04:00
|
|
|
#define kDesktopFolder "browser"
|
|
|
|
|
2007-07-02 22:20:24 +04:00
|
|
|
static void Output(const char *fmt, ... )
|
|
|
|
{
|
|
|
|
va_list ap;
|
|
|
|
va_start(ap, fmt);
|
|
|
|
|
2012-07-24 21:04:03 +04:00
|
|
|
#ifndef XP_WIN
|
2007-07-02 22:20:24 +04:00
|
|
|
vfprintf(stderr, fmt, ap);
|
2012-07-24 21:04:03 +04:00
|
|
|
#else
|
|
|
|
char msg[2048];
|
|
|
|
vsnprintf_s(msg, _countof(msg), _TRUNCATE, fmt, ap);
|
|
|
|
|
|
|
|
wchar_t wide_msg[2048];
|
|
|
|
MultiByteToWideChar(CP_UTF8,
|
|
|
|
0,
|
|
|
|
msg,
|
|
|
|
-1,
|
|
|
|
wide_msg,
|
|
|
|
_countof(wide_msg));
|
|
|
|
#if MOZ_WINCONSOLE
|
|
|
|
fwprintf_s(stderr, wide_msg);
|
|
|
|
#else
|
2013-11-12 17:31:32 +04:00
|
|
|
// Linking user32 at load-time interferes with the DLL blocklist (bug 932100).
|
|
|
|
// This is a rare codepath, so we can load user32 at run-time instead.
|
|
|
|
HMODULE user32 = LoadLibraryW(L"user32.dll");
|
|
|
|
if (user32) {
|
2014-02-18 02:32:52 +04:00
|
|
|
decltype(MessageBoxW)* messageBoxW =
|
|
|
|
(decltype(MessageBoxW)*) GetProcAddress(user32, "MessageBoxW");
|
2013-11-12 17:31:32 +04:00
|
|
|
if (messageBoxW) {
|
|
|
|
messageBoxW(nullptr, wide_msg, L"Firefox", MB_OK
|
|
|
|
| MB_ICONERROR
|
|
|
|
| MB_SETFOREGROUND);
|
|
|
|
}
|
|
|
|
FreeLibrary(user32);
|
|
|
|
}
|
2012-07-24 21:04:03 +04:00
|
|
|
#endif
|
2007-05-26 02:09:29 +04:00
|
|
|
#endif
|
2007-07-02 22:20:24 +04:00
|
|
|
|
|
|
|
va_end(ap);
|
|
|
|
}
|
2002-08-21 23:21:36 +04:00
|
|
|
|
2007-07-26 00:24:37 +04:00
|
|
|
/**
|
|
|
|
* Return true if |arg| matches the given argument name.
|
|
|
|
*/
|
2011-09-29 10:19:26 +04:00
|
|
|
static bool IsArg(const char* arg, const char* s)
|
2007-07-26 00:24:37 +04:00
|
|
|
{
|
|
|
|
if (*arg == '-')
|
|
|
|
{
|
|
|
|
if (*++arg == '-')
|
|
|
|
++arg;
|
2011-05-22 10:23:20 +04:00
|
|
|
return !strcasecmp(arg, s);
|
2007-07-26 00:24:37 +04:00
|
|
|
}
|
|
|
|
|
2014-02-11 02:57:01 +04:00
|
|
|
#if defined(XP_WIN)
|
2007-07-26 00:24:37 +04:00
|
|
|
if (*arg == '/')
|
2011-05-22 10:23:20 +04:00
|
|
|
return !strcasecmp(++arg, s);
|
2007-07-26 00:24:37 +04:00
|
|
|
#endif
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
return false;
|
2007-07-26 00:24:37 +04:00
|
|
|
}
|
|
|
|
|
2011-05-22 10:23:20 +04:00
|
|
|
XRE_GetFileFromPathType XRE_GetFileFromPath;
|
|
|
|
XRE_CreateAppDataType XRE_CreateAppData;
|
|
|
|
XRE_FreeAppDataType XRE_FreeAppData;
|
2011-05-22 10:24:32 +04:00
|
|
|
XRE_TelemetryAccumulateType XRE_TelemetryAccumulate;
|
2012-06-15 10:23:08 +04:00
|
|
|
XRE_StartupTimelineRecordType XRE_StartupTimelineRecord;
|
2011-05-22 10:23:20 +04:00
|
|
|
XRE_mainType XRE_main;
|
2013-11-05 16:45:20 +04:00
|
|
|
XRE_StopLateWriteChecksType XRE_StopLateWriteChecks;
|
2015-11-19 09:31:44 +03:00
|
|
|
XRE_XPCShellMainType XRE_XPCShellMain;
|
2016-06-03 22:49:39 +03:00
|
|
|
XRE_GetProcessTypeType XRE_GetProcessType;
|
|
|
|
XRE_SetProcessTypeType XRE_SetProcessType;
|
|
|
|
XRE_InitChildProcessType XRE_InitChildProcess;
|
|
|
|
XRE_EnableSameExecutableForContentProcType XRE_EnableSameExecutableForContentProc;
|
2016-09-01 16:07:01 +03:00
|
|
|
#ifdef LIBFUZZER
|
|
|
|
XRE_LibFuzzerSetMainType XRE_LibFuzzerSetMain;
|
|
|
|
XRE_LibFuzzerGetFuncsType XRE_LibFuzzerGetFuncs;
|
|
|
|
#endif
|
2011-06-15 20:00:28 +04:00
|
|
|
|
2011-05-22 10:23:20 +04:00
|
|
|
static const nsDynamicFunctionLoad kXULFuncs[] = {
|
|
|
|
{ "XRE_GetFileFromPath", (NSFuncPtr*) &XRE_GetFileFromPath },
|
|
|
|
{ "XRE_CreateAppData", (NSFuncPtr*) &XRE_CreateAppData },
|
|
|
|
{ "XRE_FreeAppData", (NSFuncPtr*) &XRE_FreeAppData },
|
2011-05-22 10:24:32 +04:00
|
|
|
{ "XRE_TelemetryAccumulate", (NSFuncPtr*) &XRE_TelemetryAccumulate },
|
2012-06-15 10:23:08 +04:00
|
|
|
{ "XRE_StartupTimelineRecord", (NSFuncPtr*) &XRE_StartupTimelineRecord },
|
2011-05-22 10:23:20 +04:00
|
|
|
{ "XRE_main", (NSFuncPtr*) &XRE_main },
|
2013-11-05 16:45:20 +04:00
|
|
|
{ "XRE_StopLateWriteChecks", (NSFuncPtr*) &XRE_StopLateWriteChecks },
|
2015-11-19 09:31:44 +03:00
|
|
|
{ "XRE_XPCShellMain", (NSFuncPtr*) &XRE_XPCShellMain },
|
2016-06-03 22:49:39 +03:00
|
|
|
{ "XRE_GetProcessType", (NSFuncPtr*) &XRE_GetProcessType },
|
|
|
|
{ "XRE_SetProcessType", (NSFuncPtr*) &XRE_SetProcessType },
|
|
|
|
{ "XRE_InitChildProcess", (NSFuncPtr*) &XRE_InitChildProcess },
|
|
|
|
{ "XRE_EnableSameExecutableForContentProc", (NSFuncPtr*) &XRE_EnableSameExecutableForContentProc },
|
2016-09-01 16:07:01 +03:00
|
|
|
#ifdef LIBFUZZER
|
|
|
|
{ "XRE_LibFuzzerSetMain", (NSFuncPtr*) &XRE_LibFuzzerSetMain },
|
|
|
|
{ "XRE_LibFuzzerGetFuncs", (NSFuncPtr*) &XRE_LibFuzzerGetFuncs },
|
|
|
|
#endif
|
2012-07-30 18:20:58 +04:00
|
|
|
{ nullptr, nullptr }
|
2011-05-22 10:23:20 +04:00
|
|
|
};
|
2011-05-22 10:22:27 +04:00
|
|
|
|
2016-09-01 16:07:01 +03:00
|
|
|
#ifdef LIBFUZZER
|
|
|
|
int libfuzzer_main(int argc, char **argv);
|
|
|
|
|
|
|
|
/* This wrapper is used by the libFuzzer main to call into libxul */
|
|
|
|
|
|
|
|
void libFuzzerGetFuncs(const char* moduleName, LibFuzzerInitFunc* initFunc,
|
|
|
|
LibFuzzerTestingFunc* testingFunc) {
|
|
|
|
return XRE_LibFuzzerGetFuncs(moduleName, initFunc, testingFunc);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2015-11-19 09:31:44 +03:00
|
|
|
static int do_main(int argc, char* argv[], char* envp[], nsIFile *xreDirectory)
|
2011-05-22 10:23:20 +04:00
|
|
|
{
|
2012-06-06 06:08:30 +04:00
|
|
|
nsCOMPtr<nsIFile> appini;
|
2011-11-22 11:05:59 +04:00
|
|
|
nsresult rv;
|
2013-02-13 00:51:24 +04:00
|
|
|
uint32_t mainFlags = 0;
|
2007-07-02 22:20:24 +04:00
|
|
|
|
2007-07-26 00:24:37 +04:00
|
|
|
// Allow firefox.exe to launch XULRunner apps via -app <application.ini>
|
|
|
|
// Note that -app must be the *first* argument.
|
2011-05-22 10:23:20 +04:00
|
|
|
const char *appDataFile = getenv("XUL_APP_FILE");
|
2007-10-13 09:47:04 +04:00
|
|
|
if (appDataFile && *appDataFile) {
|
|
|
|
rv = XRE_GetFileFromPath(appDataFile, getter_AddRefs(appini));
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
Output("Invalid path found: '%s'", appDataFile);
|
|
|
|
return 255;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (argc > 1 && IsArg(argv[1], "app")) {
|
2007-07-26 00:24:37 +04:00
|
|
|
if (argc == 2) {
|
|
|
|
Output("Incorrect number of arguments passed to -app");
|
|
|
|
return 255;
|
|
|
|
}
|
|
|
|
|
|
|
|
rv = XRE_GetFileFromPath(argv[2], getter_AddRefs(appini));
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
Output("application.ini path not recognized: '%s'", argv[2]);
|
|
|
|
return 255;
|
|
|
|
}
|
|
|
|
|
2011-05-22 10:23:20 +04:00
|
|
|
char appEnv[MAXPATHLEN];
|
2016-10-04 18:57:51 +03:00
|
|
|
SprintfLiteral(appEnv, "XUL_APP_FILE=%s", argv[2]);
|
Bug 1271574 - Purposefully leak the XUL_APP_FILE string passed to putenv. r=bsmedberg
Before bug 552864, the string was created with PR_smprintf, and
PR_SetEnv'ed (which, under the hood, just calls putenv). PR_smprintf was
allocating the string on the heap. Now, it's allocated on the stack, and
still putenv'ed.
putenv kind of takes ownership of the strings it's being passed, so
stack allocated strings are dangerous to use. It looks like we've been
fairly lucky that it worked, presumably because compilers would keep the
stack frame with the variable, but that's not guaranteed to happen, and
in some case, doesn't.
So we strdup the string and purposefully leak it instead, which matches
what happened before bug 552864, and is the only "sane" way to use
putenv.
--HG--
extra : rebase_source : e39349f90f5346b591e20696c0c3c7fdb26c3cfb
2016-06-02 02:44:16 +03:00
|
|
|
if (putenv(strdup(appEnv))) {
|
2011-05-22 10:23:20 +04:00
|
|
|
Output("Couldn't set %s.\n", appEnv);
|
|
|
|
return 255;
|
|
|
|
}
|
2007-07-26 00:24:37 +04:00
|
|
|
argv[2] = argv[0];
|
|
|
|
argv += 2;
|
|
|
|
argc -= 2;
|
2015-11-19 09:31:44 +03:00
|
|
|
} else if (argc > 1 && IsArg(argv[1], "xpcshell")) {
|
|
|
|
for (int i = 1; i < argc; i++) {
|
|
|
|
argv[i] = argv[i + 1];
|
|
|
|
}
|
2016-05-15 18:41:40 +03:00
|
|
|
|
|
|
|
XREShellData shellData;
|
|
|
|
#if defined(XP_WIN) && defined(MOZ_SANDBOX)
|
|
|
|
shellData.sandboxBrokerServices =
|
|
|
|
sandboxing::GetInitializedBrokerServices();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return XRE_XPCShellMain(--argc, argv, envp, &shellData);
|
2007-07-26 00:24:37 +04:00
|
|
|
}
|
|
|
|
|
2011-11-22 11:05:59 +04:00
|
|
|
if (appini) {
|
|
|
|
nsXREAppData *appData;
|
|
|
|
rv = XRE_CreateAppData(appini, &appData);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
Output("Couldn't read application.ini");
|
|
|
|
return 255;
|
|
|
|
}
|
2016-07-27 23:20:58 +03:00
|
|
|
#if defined(HAS_DLL_BLOCKLIST)
|
|
|
|
// The dll blocklist operates in the exe vs. xullib. Pass a flag to
|
|
|
|
// xullib so automated tests can check the result once the browser
|
|
|
|
// is up and running.
|
|
|
|
appData->flags |=
|
|
|
|
DllBlocklist_CheckStatus() ? NS_XRE_DLL_BLOCKLIST_ENABLED : 0;
|
|
|
|
#endif
|
2013-01-03 19:04:42 +04:00
|
|
|
// xreDirectory already has a refcount from NS_NewLocalFile
|
|
|
|
appData->xreDirectory = xreDirectory;
|
2013-02-13 00:51:24 +04:00
|
|
|
int result = XRE_main(argc, argv, appData, mainFlags);
|
2011-11-22 11:05:59 +04:00
|
|
|
XRE_FreeAppData(appData);
|
2012-02-14 22:03:31 +04:00
|
|
|
return result;
|
2007-07-02 22:20:24 +04:00
|
|
|
}
|
|
|
|
|
2015-04-23 22:10:30 +03:00
|
|
|
ScopedAppData appData(&sAppData);
|
|
|
|
nsCOMPtr<nsIFile> exeFile;
|
|
|
|
rv = mozilla::BinaryPath::GetFile(argv[0], getter_AddRefs(exeFile));
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
Output("Couldn't find the application directory.\n");
|
|
|
|
return 255;
|
2013-02-13 00:51:24 +04:00
|
|
|
}
|
|
|
|
|
2015-04-23 22:10:30 +03:00
|
|
|
nsCOMPtr<nsIFile> greDir;
|
|
|
|
exeFile->GetParent(getter_AddRefs(greDir));
|
2014-09-29 22:51:04 +04:00
|
|
|
#ifdef XP_MACOSX
|
2015-04-23 22:10:30 +03:00
|
|
|
greDir->SetNativeLeafName(NS_LITERAL_CSTRING(kOSXResourcesFolder));
|
2014-09-29 22:51:04 +04:00
|
|
|
#endif
|
2015-04-23 22:10:30 +03:00
|
|
|
nsCOMPtr<nsIFile> appSubdir;
|
|
|
|
greDir->Clone(getter_AddRefs(appSubdir));
|
|
|
|
appSubdir->Append(NS_LITERAL_STRING(kDesktopFolder));
|
2013-02-13 00:51:24 +04:00
|
|
|
|
2015-04-23 22:10:30 +03:00
|
|
|
SetStrongPtr(appData.directory, static_cast<nsIFile*>(appSubdir.get()));
|
2013-01-03 19:04:42 +04:00
|
|
|
// xreDirectory already has a refcount from NS_NewLocalFile
|
2015-04-23 22:10:30 +03:00
|
|
|
appData.xreDirectory = xreDirectory;
|
2013-02-13 00:51:24 +04:00
|
|
|
|
2016-07-27 23:20:58 +03:00
|
|
|
#if defined(HAS_DLL_BLOCKLIST)
|
|
|
|
appData.flags |=
|
|
|
|
DllBlocklist_CheckStatus() ? NS_XRE_DLL_BLOCKLIST_ENABLED : 0;
|
|
|
|
#endif
|
|
|
|
|
2016-05-15 18:41:40 +03:00
|
|
|
#if defined(XP_WIN) && defined(MOZ_SANDBOX)
|
|
|
|
sandbox::BrokerServices* brokerServices =
|
|
|
|
sandboxing::GetInitializedBrokerServices();
|
|
|
|
#if defined(MOZ_CONTENT_SANDBOX)
|
|
|
|
if (!brokerServices) {
|
|
|
|
Output("Couldn't initialize the broker services.\n");
|
|
|
|
return 255;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
appData.sandboxBrokerServices = brokerServices;
|
|
|
|
#endif
|
|
|
|
|
2016-09-01 16:07:01 +03:00
|
|
|
#ifdef LIBFUZZER
|
|
|
|
if (getenv("LIBFUZZER"))
|
|
|
|
XRE_LibFuzzerSetMain(argc, argv, libfuzzer_main);
|
|
|
|
#endif
|
|
|
|
|
2015-04-23 22:10:30 +03:00
|
|
|
return XRE_main(argc, argv, &appData, mainFlags);
|
2011-05-22 10:23:20 +04:00
|
|
|
}
|
|
|
|
|
2013-01-03 19:04:42 +04:00
|
|
|
static bool
|
|
|
|
FileExists(const char *path)
|
2011-05-22 10:23:20 +04:00
|
|
|
{
|
2013-01-03 19:04:42 +04:00
|
|
|
#ifdef XP_WIN
|
|
|
|
wchar_t wideDir[MAX_PATH];
|
|
|
|
MultiByteToWideChar(CP_UTF8, 0, path, -1, wideDir, MAX_PATH);
|
|
|
|
DWORD fileAttrs = GetFileAttributesW(wideDir);
|
|
|
|
return fileAttrs != INVALID_FILE_ATTRIBUTES;
|
|
|
|
#else
|
|
|
|
return access(path, R_OK) == 0;
|
|
|
|
#endif
|
|
|
|
}
|
2011-05-22 10:23:20 +04:00
|
|
|
|
2013-01-03 19:04:42 +04:00
|
|
|
static nsresult
|
|
|
|
InitXPCOMGlue(const char *argv0, nsIFile **xreDirectory)
|
|
|
|
{
|
|
|
|
char exePath[MAXPATHLEN];
|
2011-12-19 21:47:09 +04:00
|
|
|
|
2013-01-03 19:04:42 +04:00
|
|
|
nsresult rv = mozilla::BinaryPath::Get(argv0, exePath);
|
2011-05-22 10:23:20 +04:00
|
|
|
if (NS_FAILED(rv)) {
|
2013-01-03 19:04:42 +04:00
|
|
|
Output("Couldn't find the application directory.\n");
|
|
|
|
return rv;
|
2011-05-22 10:23:20 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
char *lastSlash = strrchr(exePath, XPCOM_FILE_PATH_SEPARATOR[0]);
|
2016-09-12 23:04:39 +03:00
|
|
|
if (!lastSlash ||
|
|
|
|
(size_t(lastSlash - exePath) > MAXPATHLEN - sizeof(XPCOM_DLL) - 1))
|
2013-01-03 19:04:42 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2015-10-06 06:13:33 +03:00
|
|
|
strcpy(lastSlash + 1, XPCOM_DLL);
|
2013-01-03 19:04:42 +04:00
|
|
|
|
|
|
|
if (!FileExists(exePath)) {
|
|
|
|
Output("Could not find the Mozilla runtime.\n");
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2012-05-28 06:40:49 +04:00
|
|
|
|
2012-08-02 18:50:29 +04:00
|
|
|
// We do this because of data in bug 771745
|
2012-07-09 05:54:10 +04:00
|
|
|
XPCOMGlueEnablePreload();
|
2011-05-16 12:25:05 +04:00
|
|
|
|
2011-05-22 10:23:20 +04:00
|
|
|
rv = XPCOMGlueStartup(exePath);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
Output("Couldn't load XPCOM.\n");
|
2013-01-03 19:04:42 +04:00
|
|
|
return rv;
|
2011-05-22 10:23:20 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
rv = XPCOMGlueLoadXULFunctions(kXULFuncs);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
Output("Couldn't load XRE functions.\n");
|
2013-01-03 19:04:42 +04:00
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2015-04-23 22:10:30 +03:00
|
|
|
// This will set this thread as the main thread.
|
2013-01-19 12:40:02 +04:00
|
|
|
NS_LogInit();
|
|
|
|
|
2016-06-03 22:49:39 +03:00
|
|
|
if (xreDirectory) {
|
|
|
|
// chop XPCOM_DLL off exePath
|
|
|
|
*lastSlash = '\0';
|
2014-09-29 22:51:04 +04:00
|
|
|
#ifdef XP_MACOSX
|
2016-06-03 22:49:39 +03:00
|
|
|
lastSlash = strrchr(exePath, XPCOM_FILE_PATH_SEPARATOR[0]);
|
|
|
|
strcpy(lastSlash + 1, kOSXResourcesFolder);
|
2014-09-29 22:51:04 +04:00
|
|
|
#endif
|
2013-01-03 19:04:42 +04:00
|
|
|
#ifdef XP_WIN
|
2016-06-03 22:49:39 +03:00
|
|
|
rv = NS_NewLocalFile(NS_ConvertUTF8toUTF16(exePath), false,
|
|
|
|
xreDirectory);
|
2013-01-03 19:04:42 +04:00
|
|
|
#else
|
2016-06-03 22:49:39 +03:00
|
|
|
rv = NS_NewNativeLocalFile(nsDependentCString(exePath), false,
|
|
|
|
xreDirectory);
|
2013-01-03 19:04:42 +04:00
|
|
|
#endif
|
2016-06-03 22:49:39 +03:00
|
|
|
}
|
2013-01-03 19:04:42 +04:00
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2015-11-19 09:31:44 +03:00
|
|
|
int main(int argc, char* argv[], char* envp[])
|
2013-01-03 19:04:42 +04:00
|
|
|
{
|
2016-07-08 02:00:23 +03:00
|
|
|
mozilla::TimeStamp start = mozilla::TimeStamp::Now();
|
|
|
|
|
|
|
|
#ifdef HAS_DLL_BLOCKLIST
|
|
|
|
DllBlocklist_Initialize();
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
// In order to be effective against AppInit DLLs, the blocklist must be
|
|
|
|
// initialized before user32.dll is loaded into the process (bug 932100).
|
|
|
|
if (GetModuleHandleA("user32.dll")) {
|
|
|
|
fprintf(stderr, "DLL blocklist was unable to intercept AppInit DLLs.\n");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2016-06-03 22:49:39 +03:00
|
|
|
#ifdef MOZ_BROWSER_CAN_BE_CONTENTPROC
|
|
|
|
// We are launching as a content process, delegate to the appropriate
|
|
|
|
// main
|
|
|
|
if (argc > 1 && IsArg(argv[1], "contentproc")) {
|
|
|
|
#if defined(XP_WIN) && defined(MOZ_SANDBOX)
|
|
|
|
// We need to initialize the sandbox TargetServices before InitXPCOMGlue
|
|
|
|
// because we might need the sandbox broker to give access to some files.
|
2016-06-07 16:03:51 +03:00
|
|
|
if (IsSandboxedProcess() && !sandboxing::GetInitializedTargetServices()) {
|
2016-06-03 22:49:39 +03:00
|
|
|
Output("Failed to initialize the sandbox target services.");
|
|
|
|
return 255;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
nsresult rv = InitXPCOMGlue(argv[0], nullptr);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return 255;
|
|
|
|
}
|
|
|
|
|
|
|
|
int result = content_process_main(argc, argv);
|
|
|
|
|
|
|
|
// InitXPCOMGlue calls NS_LogInit, so we need to balance it here.
|
|
|
|
NS_LogTerm();
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2013-01-03 19:04:42 +04:00
|
|
|
|
|
|
|
nsIFile *xreDirectory;
|
|
|
|
|
|
|
|
nsresult rv = InitXPCOMGlue(argv[0], &xreDirectory);
|
|
|
|
if (NS_FAILED(rv)) {
|
2011-05-22 10:23:20 +04:00
|
|
|
return 255;
|
|
|
|
}
|
|
|
|
|
2012-06-15 10:23:08 +04:00
|
|
|
XRE_StartupTimelineRecord(mozilla::StartupTimeline::START, start);
|
|
|
|
|
2016-06-03 22:49:39 +03:00
|
|
|
#ifdef MOZ_BROWSER_CAN_BE_CONTENTPROC
|
|
|
|
XRE_EnableSameExecutableForContentProc();
|
|
|
|
#endif
|
|
|
|
|
2015-11-19 09:31:44 +03:00
|
|
|
int result = do_main(argc, argv, envp, xreDirectory);
|
2013-01-19 12:40:02 +04:00
|
|
|
|
|
|
|
NS_LogTerm();
|
2011-05-22 10:23:20 +04:00
|
|
|
|
2013-01-04 19:27:41 +04:00
|
|
|
#ifdef XP_MACOSX
|
|
|
|
// Allow writes again. While we would like to catch writes from static
|
|
|
|
// destructors to allow early exits to use _exit, we know that there is
|
|
|
|
// at least one such write that we don't control (see bug 826029). For
|
|
|
|
// now we enable writes again and early exits will have to use exit instead
|
|
|
|
// of _exit.
|
2013-11-05 16:45:20 +04:00
|
|
|
XRE_StopLateWriteChecks();
|
2013-01-04 19:27:41 +04:00
|
|
|
#endif
|
|
|
|
|
2007-07-02 22:20:24 +04:00
|
|
|
return result;
|
2002-08-21 23:21:36 +04:00
|
|
|
}
|