Bug 1851095 - Step 2: Connect setproctitle to the fork server. r=nika

This adds a small function that concatenates the args (because not
only does the BSD `setproctitle` take a single string, but also the
Linux kernel code that implements `/proc/{pid}/cmdline` won't allow the
"arguments" to extend past their original length unless it's a single
string), and connects it to the fork server.

Differential Revision: https://phabricator.services.mozilla.com/D187635
This commit is contained in:
Jed Davis 2023-09-22 03:41:39 +00:00
Родитель c48e55cb24
Коммит df9fa90f41
5 изменённых файлов: 86 добавлений и 1 удалений

Просмотреть файл

@ -27,6 +27,7 @@
# include "mozilla/Unused.h"
# include "mozilla/ScopeExit.h"
# include "mozilla/ipc/ProcessUtils.h"
# include "mozilla/ipc/SetProcessTitle.h"
using namespace mozilla::ipc;
#endif
@ -142,6 +143,7 @@ void AppProcessBuilder::ReplaceArguments(int* argcp, char*** argvp) {
*p = nullptr;
*argvp = argv;
*argcp = argv_.size();
mozilla::SetProcessTitle(argv_);
}
void AppProcessBuilder::InitAppProcess(int* argcp, char*** argvp) {

Просмотреть файл

@ -14,6 +14,7 @@
#include "mozilla/ipc/FileDescriptor.h"
#include "mozilla/ipc/IPDLParamTraits.h"
#include "mozilla/ipc/ProtocolMessageUtils.h"
#include "mozilla/ipc/SetProcessTitle.h"
#include "nsTraceRefcnt.h"
#include <fcntl.h>
@ -256,6 +257,8 @@ bool ForkServer::RunForkServer(int* aArgc, char*** aArgv) {
bool sleep_newproc = !!getenv("MOZ_FORKSERVER_WAIT_GDB_NEWPROC");
#endif
SetProcessTitleInit(*aArgv);
// Do this before NS_LogInit() to avoid log files taking lower
// FDs.
ForkServer forkserver;

Просмотреть файл

@ -0,0 +1,51 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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 "mozilla/ipc/SetProcessTitle.h"
#include "nsString.h"
#ifdef XP_LINUX
# include "base/set_process_title_linux.h"
# define HAVE_SETPROCTITLE
# define HAVE_SETPROCTITLE_INIT
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \
defined(__DragonFly__)
# include <sys/types.h>
# include <unistd.h>
# define HAVE_SETPROCTITLE
#endif
namespace mozilla {
void SetProcessTitle(const std::vector<std::string>& aNewArgv) {
#ifdef HAVE_SETPROCTITLE
nsAutoCStringN<1024> buf;
bool firstArg = true;
for (const std::string& arg : aNewArgv) {
if (firstArg) {
firstArg = false;
} else {
buf.Append(' ');
}
buf.Append(arg.c_str());
}
setproctitle("-%s", buf.get());
#endif
}
void SetProcessTitleInit(char** aOrigArgv) {
#ifdef HAVE_SETPROCTITLE_INIT
setproctitle_init(aOrigArgv);
#endif
}
} // namespace mozilla

Просмотреть файл

@ -0,0 +1,19 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */
#ifndef mozilla_ipc_SetProcessTitle_h
#define mozilla_ipc_SetProcessTitle_h
#include <string>
#include <vector>
namespace mozilla {
void SetProcessTitle(const std::vector<std::string>& aNewArgv);
void SetProcessTitleInit(char** aOrigArgv);
} // namespace mozilla
#endif // mozilla_ipc_SetProcessTitle_h

Просмотреть файл

@ -125,9 +125,19 @@ else:
if CONFIG["OS_ARCH"] == "Linux":
UNIFIED_SOURCES += [
"ProcessUtils_linux.cpp",
"SetProcessTitle.cpp",
]
EXPORTS.mozilla.ipc += [
"SetProcessTitle.h",
]
elif CONFIG["OS_ARCH"] in ("DragonFly", "FreeBSD", "NetBSD", "OpenBSD"):
UNIFIED_SOURCES += ["ProcessUtils_bsd.cpp"]
UNIFIED_SOURCES += [
"ProcessUtils_bsd.cpp",
"SetProcessTitle.cpp",
]
EXPORTS.ipc += [
"SetProcessTitle.h",
]
elif CONFIG["OS_ARCH"] == "Darwin":
UNIFIED_SOURCES += ["ProcessUtils_mac.mm"]
else: