From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [IPv6:2a00:1450:4864:20::331]) by sourceware.org (Postfix) with ESMTPS id 0641B386F829 for ; Wed, 21 Jul 2021 18:09:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0641B386F829 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com Received: by mail-wm1-x331.google.com with SMTP id n4so1848601wms.1 for ; Wed, 21 Jul 2021 11:09:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=VeY/vVyYmrkgCAhFpV7rj2gOQ/cmoRWRwbc3T8TL1Tg=; b=MGFlrANATbtphhc2V6/2R1Tf3ZiLULvBQH/SmkUu1ihtsKNGNll+ObLjC39mZBDLNO NDPygiy5CDmy76ThmY6kjwmFQGRjDRoB7hSMBO5yL2KY9QYBhFSzwO3YA3rWPyMKeRZ1 TbevabjkJV8/ngU4b4q6NtAG4OLR3CE2AYW+IdjGmtaw/NHxB49ZbnxVfxknt9ETvHcQ tvBND3OI7tJUZQ4R5An66/pZiAVg0wWcaneNt8icOXZokcz7n2QAD3fp1KOl2hztvAEX KrEkbFOSJQ9uv4fB5i3+XVBXZnjHtv8A5vzTg5fihodufjXy90z7rjV5ww/xsYwckuKj AU1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=VeY/vVyYmrkgCAhFpV7rj2gOQ/cmoRWRwbc3T8TL1Tg=; b=NnBCpt3bmRJVNGCl+xdHPtWJdPvaZWYUd9HPABGxEEUMbtJmFPRt6rpVmaOOlPca+M AXbPCYBKwuX5EprIs0d7+zk0qVeJ7BFN+Z5Raal8Afxl0mWxFQoNkGK9i9mORS2r2atV Ylntsbkx8f3dXDLmXqFaaZadM+teiY9d9eeNsahMnu4t/5tb5U52CzH2lKrmJFQy3QAa WQKwWz2ydN9nwolEfmOorF6RfYsH9r/XVD3YeY44VG1+0kfECeU8gW0RjozvpL+cdVvV kaG6huzqx+OH8lt0SejyblwsLB93AGxxtgjLL/t2kLrzznKAvTJbB65fEj9JGwZoSdSQ P6cw== X-Gm-Message-State: AOAM531r/nkTPy6l0+hmTDAnmUYeCGzSrlpCXpnHQ+lATe0jp1y/Ugsx G0lDUnI+2wVleG8YZv5W1mUO5J9dmzVarQ== X-Google-Smtp-Source: ABdhPJytLVvJEiHdyubIJuAcUsS7J5jVF92ZFg9xuzC/7OMB/i9TXUFoR/D2PCHjoGVnq2UHDI4Zcw== X-Received: by 2002:a05:600c:1c93:: with SMTP id k19mr39173038wms.125.1626890939986; Wed, 21 Jul 2021 11:08:59 -0700 (PDT) Received: from localhost (host86-134-238-200.range86-134.btcentralplus.com. [86.134.238.200]) by smtp.gmail.com with ESMTPSA id n16sm27843289wrr.73.2021.07.21.11.08.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 Jul 2021 11:08:59 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Subject: [PATCHv2 2/6] gdb: register signal handler after setting up event token Date: Wed, 21 Jul 2021 19:08:49 +0100 Message-Id: <8a82c968eef0bc232016ad5c7c6e5985a6689446.1626890878.git.andrew.burgess@embecosm.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Jul 2021 18:09:02 -0000 This commit fixes the smallest of small possible bug related to signal handling. If we look in async_init_signals we see code like this: signal (SIGQUIT, handle_sigquit); sigquit_token = create_async_signal_handler (async_do_nothing, NULL, "sigquit"); Then if we look in handle_sigquit we see code like this: mark_async_signal_handler (sigquit_token); signal (sig, handle_sigquit); Finally, in mark_async_signal_handler we have: async_handler_ptr->ready = 1; Where async_handler_ptr will be sigquit_token. What this means is that if a SIGQUIT arrive in async_init_signals after handle_sigquit has been registered, but before sigquit_token has been initialised, then GDB will most likely crash. The chance of this happening is tiny, but fixing this is trivial, just ensure we call create_async_signal_handler before calling signal, so lets do that. There are no tests for this. Trying to land a signal in the right spot is pretty hit and miss. I did try changing the current HEAD GDB like this: signal (SIGQUIT, handle_sigquit); raise (SIGQUIT); sigquit_token = create_async_signal_handler (async_do_nothing, NULL, "sigquit"); And confirmed that this did result in a crash, after my change I tried this: sigquit_token = create_async_signal_handler (async_do_nothing, NULL, "sigquit"); signal (SIGQUIT, handle_sigquit); raise (SIGQUIT); And GDB now starts up just fine. gdb/ChangeLog: * event-top.c (async_init_signals): For each signal, call signal only after calling create_async_signal_handler. --- gdb/event-top.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gdb/event-top.c b/gdb/event-top.c index ab5179b7d32..2d3bfa6a9c9 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -918,12 +918,13 @@ async_init_signals (void) quit_serial_event = make_serial_event (); - signal (SIGINT, handle_sigint); sigint_token = create_async_signal_handler (async_request_quit, NULL, "sigint"); - signal (SIGTERM, handle_sigterm); + signal (SIGINT, handle_sigint); + async_sigterm_token = create_async_signal_handler (async_sigterm_handler, NULL, "sigterm"); + signal (SIGTERM, handle_sigterm); /* If SIGTRAP was set to SIG_IGN, then the SIG_IGN will get passed to the inferior and breakpoints will be ignored. */ @@ -940,10 +941,11 @@ async_init_signals (void) might be in memory, shared between the two). Since we establish a handler for SIGQUIT, when we call exec it will set the signal to SIG_DFL for us. */ - signal (SIGQUIT, handle_sigquit); sigquit_token = create_async_signal_handler (async_do_nothing, NULL, "sigquit"); + signal (SIGQUIT, handle_sigquit); #endif + #ifdef SIGHUP if (signal (SIGHUP, handle_sighup) != SIG_IGN) sighup_token = -- 2.25.4