From dd20b34acb7e97302f63f165f49a2559b7cc7856 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 24 Oct 2022 11:18:22 +0200 Subject: [PATCH] Ladybird: Ignore SIGINT when we're being debugged Let's ignore SIGINT if we're being debugged because GDB incorrectly forwards the signal to us even when it's set to "nopass". See https://sourceware.org/bugzilla/show_bug.cgi?id=9425 for details. --- Ladybird/main.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Ladybird/main.cpp b/Ladybird/main.cpp index 1440bca34d..28400e5611 100644 --- a/Ladybird/main.cpp +++ b/Ladybird/main.cpp @@ -10,18 +10,48 @@ #include #include #include +#include +#include #include #include #include Browser::Settings* s_settings; +static ErrorOr handle_attached_debugger() +{ +#ifdef AK_OS_LINUX + // Let's ignore SIGINT if we're being debugged because GDB + // incorrectly forwards the signal to us even when it's set to + // "nopass". See https://sourceware.org/bugzilla/show_bug.cgi?id=9425 + // for details. + auto unbuffered_status_file = TRY(Core::Stream::File::open("/proc/self/status"sv, Core::Stream::OpenMode::Read)); + auto status_file = TRY(Core::Stream::BufferedFile::create(move(unbuffered_status_file))); + auto buffer = TRY(ByteBuffer::create_uninitialized(4096)); + while (TRY(status_file->can_read_line())) { + auto line = TRY(status_file->read_line(buffer)); + auto const parts = line.split_view(':'); + if (parts.size() < 2 || parts[0] != "TracerPid"sv) + continue; + auto tracer_pid = parts[1].to_uint(); + if (tracer_pid != 0UL) { + dbgln("Debugger is attached, ignoring SIGINT"); + TRY(Core::System::signal(SIGINT, SIG_IGN)); + } + break; + } +#endif + return {}; +} + ErrorOr serenity_main(Main::Arguments arguments) { // NOTE: This is only used for the Core::Socket inside the IPC connections. // FIXME: Refactor things so we can get rid of this somehow. Core::EventLoop event_loop; + TRY(handle_attached_debugger()); + QApplication app(arguments.argc, arguments.argv); platform_init();