From df9fa90f414ee7e348a71ee2246e3081e8df6554 Mon Sep 17 00:00:00 2001 From: Jed Davis Date: Fri, 22 Sep 2023 03:41:39 +0000 Subject: [PATCH] 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 --- ipc/chromium/src/base/process_util_linux.cc | 2 + ipc/glue/ForkServer.cpp | 3 ++ ipc/glue/SetProcessTitle.cpp | 51 +++++++++++++++++++++ ipc/glue/SetProcessTitle.h | 19 ++++++++ ipc/glue/moz.build | 12 ++++- 5 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 ipc/glue/SetProcessTitle.cpp create mode 100644 ipc/glue/SetProcessTitle.h diff --git a/ipc/chromium/src/base/process_util_linux.cc b/ipc/chromium/src/base/process_util_linux.cc index 4f751982df8d..e523036c587f 100644 --- a/ipc/chromium/src/base/process_util_linux.cc +++ b/ipc/chromium/src/base/process_util_linux.cc @@ -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) { diff --git a/ipc/glue/ForkServer.cpp b/ipc/glue/ForkServer.cpp index 322de0d48617..2eaf63759843 100644 --- a/ipc/glue/ForkServer.cpp +++ b/ipc/glue/ForkServer.cpp @@ -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 @@ -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; diff --git a/ipc/glue/SetProcessTitle.cpp b/ipc/glue/SetProcessTitle.cpp new file mode 100644 index 000000000000..4d929fb53c56 --- /dev/null +++ b/ipc/glue/SetProcessTitle.cpp @@ -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 +# include +# define HAVE_SETPROCTITLE + +#endif + +namespace mozilla { + +void SetProcessTitle(const std::vector& 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 diff --git a/ipc/glue/SetProcessTitle.h b/ipc/glue/SetProcessTitle.h new file mode 100644 index 000000000000..01b8caa3ce02 --- /dev/null +++ b/ipc/glue/SetProcessTitle.h @@ -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 +#include + +namespace mozilla { + +void SetProcessTitle(const std::vector& aNewArgv); +void SetProcessTitleInit(char** aOrigArgv); + +} // namespace mozilla + +#endif // mozilla_ipc_SetProcessTitle_h diff --git a/ipc/glue/moz.build b/ipc/glue/moz.build index b307188f3b1c..5e6ad3658ec7 100644 --- a/ipc/glue/moz.build +++ b/ipc/glue/moz.build @@ -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: