diff options
author | Gunnar Beutner <gunnar@beutner.name> | 2022-10-24 11:18:22 +0200 |
---|---|---|
committer | Andrew Kaster <andrewdkaster@gmail.com> | 2022-12-25 07:58:58 -0700 |
commit | dd20b34acb7e97302f63f165f49a2559b7cc7856 (patch) | |
tree | c26caf35f1f3d911535deb97ef7bda535cecc902 /Ladybird/main.cpp | |
parent | 11b730fccb2e36a6b1409dddb54772e635638be2 (diff) | |
download | serenity-dd20b34acb7e97302f63f165f49a2559b7cc7856.zip |
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.
Diffstat (limited to 'Ladybird/main.cpp')
-rw-r--r-- | Ladybird/main.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
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 <LibCore/ArgsParser.h> #include <LibCore/EventLoop.h> #include <LibCore/File.h> +#include <LibCore/Stream.h> +#include <LibCore/System.h> #include <LibGfx/Font/FontDatabase.h> #include <LibMain/Main.h> #include <QApplication> Browser::Settings* s_settings; +static ErrorOr<void> 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<u32>(); + if (tracer_pid != 0UL) { + dbgln("Debugger is attached, ignoring SIGINT"); + TRY(Core::System::signal(SIGINT, SIG_IGN)); + } + break; + } +#endif + return {}; +} + ErrorOr<int> 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(); |