From afb3a4a03091a728e665d2bc57ed3af413742cdd Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Sun, 26 Mar 2023 09:39:52 -0600 Subject: [PATCH] LibSQL: Block signals while forking SQLServer in Lagom When debugging in Xcode, the waitpid() for the initial forked process would always return EINTR or ECHILD. Work around this by blocking all signals until we're ready to wait for the initial child. --- Userland/Libraries/LibSQL/SQLClient.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibSQL/SQLClient.cpp b/Userland/Libraries/LibSQL/SQLClient.cpp index 9fdd842f0f..53479fb124 100644 --- a/Userland/Libraries/LibSQL/SQLClient.cpp +++ b/Userland/Libraries/LibSQL/SQLClient.cpp @@ -15,6 +15,7 @@ # include # include # include +# include #endif namespace SQL { @@ -58,9 +59,14 @@ static ErrorOr launch_server(DeprecatedString const& socket_path, Deprecat return server_fd_or_error.release_error(); } auto server_fd = server_fd_or_error.value(); + sigset_t original_set; + sigset_t setting_set; + sigfillset(&setting_set); + (void)pthread_sigmask(SIG_BLOCK, &setting_set, &original_set); auto server_pid = TRY(Core::System::fork()); if (server_pid == 0) { + (void)pthread_sigmask(SIG_SETMASK, &original_set, nullptr); TRY(Core::System::setsid()); TRY(Core::System::signal(SIGCHLD, SIG_IGN)); server_pid = TRY(Core::System::fork()); @@ -95,8 +101,12 @@ static ErrorOr launch_server(DeprecatedString const& socket_path, Deprecat VERIFY_NOT_REACHED(); } + VERIFY(server_pid > 0); - TRY(Core::System::waitpid(server_pid)); + auto wait_err = Core::System::waitpid(server_pid); + (void)pthread_sigmask(SIG_SETMASK, &original_set, nullptr); + if (wait_err.is_error()) + return wait_err.release_error(); return {}; }