]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
fix: Reset signal mask and defaults when executing compiler
authorJoel Rosdahl <joel@rosdahl.net>
Thu, 20 Mar 2025 18:49:06 +0000 (19:49 +0100)
committerJoel Rosdahl <joel@rosdahl.net>
Sat, 22 Mar 2025 12:51:34 +0000 (13:51 +0100)
Fixes regression in 1eb0aa5b9bcf74bd2ca6f161e406da64ccd349af where
posix_spawn was introduced to replace fork.

Fixes #1580.

src/ccache/execute.cpp
src/ccache/signalhandler.cpp
src/ccache/signalhandler.hpp

index 80e28a723aebf6e67b47b480b3f27bbbde255bcd..f3e1ad74051e902ad2cf8a41189b0db87aff0f86 100644 (file)
@@ -1,5 +1,5 @@
 // Copyright (C) 2002 Andrew Tridgell
-// Copyright (C) 2011-2024 Joel Rosdahl and other contributors
+// Copyright (C) 2011-2025 Joel Rosdahl and other contributors
 //
 // See doc/AUTHORS.adoc for a complete list of contributors.
 //
 #  include <sys/wait.h>
 #endif
 
+#ifndef _WIN32
+#  include <signal.h> // NOLINT: sigaddset et al are defined in signal.h
+#endif
+
 namespace fs = util::filesystem;
 
 #ifdef _WIN32
@@ -312,13 +316,30 @@ execute(Context& ctx,
   CHECK_LIB_CALL(posix_spawn_file_actions_adddup2, &fa, *err, STDERR_FILENO);
   CHECK_LIB_CALL(posix_spawn_file_actions_addclose, &fa, *err);
 
+  posix_spawnattr_t attr;
+  CHECK_LIB_CALL(posix_spawnattr_init, &attr);
+  CHECK_LIB_CALL(posix_spawnattr_setflags,
+                 &attr,
+                 POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK);
+
+  sigset_t sigmask;
+  CHECK_LIB_CALL(sigemptyset, &sigmask);
+  CHECK_LIB_CALL(posix_spawnattr_setsigmask, &attr, &sigmask);
+
+  sigset_t sigdefault;
+  CHECK_LIB_CALL(sigemptyset, &sigdefault);
+  for (int signum : SignalHandler::get_handled_signals()) {
+    CHECK_LIB_CALL(sigaddset, &sigdefault, signum);
+  }
+  CHECK_LIB_CALL(posix_spawnattr_setsigdefault, &attr, &sigdefault);
+
   int result;
   {
     SignalHandlerBlocker signal_handler_blocker;
     pid_t pid;
     extern char** environ;
     result = posix_spawn(
-      &pid, argv[0], &fa, nullptr, const_cast<char* const*>(argv), environ);
+      &pid, argv[0], &fa, &attr, const_cast<char* const*>(argv), environ);
     if (result == 0) {
       ctx.compiler_pid = pid;
     }
index f10c459aea23e3c43ae2960cb56380764cc4ece3..3b437e3e446d15a21c9ef704a5cc4943e1c0dd0b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2020-2024 Joel Rosdahl and other contributors
+// Copyright (C) 2020-2025 Joel Rosdahl and other contributors
 //
 // See doc/AUTHORS.adoc for a complete list of contributors.
 //
@@ -31,7 +31,7 @@ namespace {
 SignalHandler* g_the_signal_handler = nullptr;
 sigset_t g_fatal_signal_set;
 
-const int k_handled_signals[] = {
+const std::vector<int> k_handled_signals = {
   SIGINT,
   SIGTERM,
 #ifdef SIGHUP
@@ -135,6 +135,12 @@ SignalHandler::unblock_signals()
   sigprocmask(SIG_SETMASK, &empty, nullptr);
 }
 
+const std::vector<int>&
+SignalHandler::get_handled_signals()
+{
+  return k_handled_signals;
+}
+
 SignalHandlerBlocker::SignalHandlerBlocker()
 {
   SignalHandler::block_signals();
index b75e4667417750a9fbd0679cf49420c1858212b8..45a56776c98f03bb0df5214c5fb5b586643eea9b 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2020-2023 Joel Rosdahl and other contributors
+// Copyright (C) 2020-2025 Joel Rosdahl and other contributors
 //
 // See doc/AUTHORS.adoc for a complete list of contributors.
 //
@@ -18,6 +18,8 @@
 
 #pragma once
 
+#include <vector>
+
 class Context;
 
 class SignalHandler
@@ -30,6 +32,8 @@ public:
   static void block_signals();
   static void unblock_signals();
 
+  static const std::vector<int>& get_handled_signals();
+
 private:
 #ifndef _WIN32
   Context& m_ctx;