From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id DoU0KDXEC2jkaQUAWB0awg (envelope-from ) for ; Fri, 25 Apr 2025 13:19:49 -0400 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=UMqsfT1x; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=dgumi+vU; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=UMqsfT1x; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=dgumi+vU; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 93F981E10E; Fri, 25 Apr 2025 13:19:49 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 89EB21E0C0 for ; Fri, 25 Apr 2025 13:19:47 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 51B183857BA2 for ; Fri, 25 Apr 2025 17:19:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 51B183857BA2 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=UMqsfT1x; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=dgumi+vU; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=UMqsfT1x; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=dgumi+vU Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.223.131]) by sourceware.org (Postfix) with ESMTPS id A390A3858280 for ; Fri, 25 Apr 2025 17:18:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org A390A3858280 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org A390A3858280 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=195.135.223.131 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1745601530; cv=none; b=giBbjUT7bSeTAgn9OHE0sixuBKz6vsG5vl0eHPX2LoAtTVbu56AwNshvFPZqMkxPTwZaUGo4jL00b6saTONa/m9GRA2G8uBFnah7wbukLVxoDzWT50q987sUElaXbqMk0yG8bbLSOEYCk6eyvTTMTzKjCp1zVQDK0bzwAwnn1aA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1745601530; c=relaxed/simple; bh=3vsyiwVqIs6TIufPLk4os2kS0L9OEyNWZR5wuezJpow=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:From: To:Subject:Date:Message-ID:MIME-Version; b=ohs/jSrQQi2+oD6kkQbgxprYh75O0I+y7CYwkbRHPlcvVleg8okaDXXmdytLS4xFirbF/9goIDfYIlnx8waNL1onkNZe5R/riOdsV2Rs6h98+8DZWgHWKHyFdIlxd/bU1fCF79pggUPSJNhW7/yCvyJ0zgr2jed7+syCmBA5hwM= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A390A3858280 Received: from imap1.dmz-prg2.suse.org (unknown [10.150.64.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 95ABA1F38D for ; Fri, 25 Apr 2025 17:18:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1745601529; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6S/Hd0rdfDNZYKk2MkLcwI6ITei3+zKY0ULoHdkm/WE=; b=UMqsfT1x5rVl9GbPsixnpRCgrOayKrgwdpZGCrL5GJTq+jssB0haZm+CL8pGGDrj3oUnI5 CfZ9qgtlzaDB8jbjukLEFAITQi6zG7VM7O5q/fVzNGB79CFaYnJQsTb6UL2STB2d5sFVhj Z0O10DaJgPu0FBhw5IztoQTtcgEAwmw= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1745601529; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6S/Hd0rdfDNZYKk2MkLcwI6ITei3+zKY0ULoHdkm/WE=; b=dgumi+vUQ4XXzagQm1oWH8ihUas3DHVXea1GVVLeap+TQCSr/Q8C7Ki9cogJDze6Arsknw zoqhfPIgNtpKHBAA== Authentication-Results: smtp-out2.suse.de; none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1745601529; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6S/Hd0rdfDNZYKk2MkLcwI6ITei3+zKY0ULoHdkm/WE=; b=UMqsfT1x5rVl9GbPsixnpRCgrOayKrgwdpZGCrL5GJTq+jssB0haZm+CL8pGGDrj3oUnI5 CfZ9qgtlzaDB8jbjukLEFAITQi6zG7VM7O5q/fVzNGB79CFaYnJQsTb6UL2STB2d5sFVhj Z0O10DaJgPu0FBhw5IztoQTtcgEAwmw= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1745601529; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6S/Hd0rdfDNZYKk2MkLcwI6ITei3+zKY0ULoHdkm/WE=; b=dgumi+vUQ4XXzagQm1oWH8ihUas3DHVXea1GVVLeap+TQCSr/Q8C7Ki9cogJDze6Arsknw zoqhfPIgNtpKHBAA== Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 7C8DF13A79 for ; Fri, 25 Apr 2025 17:18:49 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id 8FvOHPnDC2heEAAAD6G6ig (envelope-from ) for ; Fri, 25 Apr 2025 17:18:49 +0000 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH 1/2] [gdb] Fix sig_write for null gdb_stderr Date: Fri, 25 Apr 2025 19:18:44 +0200 Message-ID: <20250425171845.9934-2-tdevries@suse.de> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250425171845.9934-1-tdevries@suse.de> References: <20250425171845.9934-1-tdevries@suse.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spamd-Result: default: False [-2.80 / 50.00]; BAYES_HAM(-3.00)[100.00%]; MID_CONTAINS_FROM(1.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; R_MISSING_CHARSET(0.50)[]; NEURAL_HAM_SHORT(-0.20)[-1.000]; MIME_GOOD(-0.10)[text/plain]; FUZZY_BLOCKED(0.00)[rspamd.com]; RCVD_VIA_SMTP_AUTH(0.00)[]; RCPT_COUNT_ONE(0.00)[1]; ARC_NA(0.00)[]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; DBL_BLOCKED_OPENRESOLVER(0.00)[suse.de:mid,gnu.org:url]; FROM_EQ_ENVFROM(0.00)[]; FROM_HAS_DN(0.00)[]; MIME_TRACE(0.00)[0:+]; RCVD_COUNT_TWO(0.00)[2]; TO_MATCH_ENVRCPT_ALL(0.00)[]; TO_DN_NONE(0.00)[]; PREVIOUSLY_DELIVERED(0.00)[gdb-patches@sourceware.org]; RCVD_TLS_ALL(0.00)[] X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org When running test-case gdb.tui/tui-layout-asm.exp with target board dwarf5-fission-debug-types, the test-case fails and I get a core dump: ... # of unexpected core files 1 ... Looking at the backtrace of the core file, what seems to be happening is that: - gdbpy_flush attempts to flush gdb_stdout, which is nullptr - that causes a segfault - gdb intercepts this and starts to handle it using handle_fatal_signal - handle_fatal_signal calls sig_write, which attempts to write to gdb_stderr, which is nullptr, - that causes another segfault - gdb exits I managed to reproduce the problem by the following trigger patch in stdin_event_handler: ... - if (error) + if (1 || error) { current_ui = main_ui; ui->unregister_file_handler (); - if (main_ui == ui) + if (1 || main_ui == ui) { gdb_printf (gdb_stderr, _("error detected on stdin\n")); + gdb_stderr = nullptr; + gdb_stdout = nullptr; + gdb_stdlog = nullptr; quit_command ((char *) 0, 0); } ... which gives us: ... $ gdb (gdb) error detected on stdin Segmentation fault (core dumped) $ q ... Fix sig_write to handle the case that gdb_stderr == nullptr, such that we get instead: ... $ gdb (gdb) error detected on stdin Fatal signal: Segmentation fault ----- Backtrace ----- ... --------------------- A fatal error internal to GDB has been detected, further debugging is not possible. GDB will now terminate. This is a bug, please report it. For instructions, see: . Segmentation fault (core dumped) $ q ... Tested on x86_64-linux. --- gdb/bt-utils.c | 30 +++++++++++++++++++++--------- gdb/event-top.c | 13 +++++++++++-- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/gdb/bt-utils.c b/gdb/bt-utils.c index 8e782450ae9..9e9f680f9ea 100644 --- a/gdb/bt-utils.c +++ b/gdb/bt-utils.c @@ -55,7 +55,10 @@ libbacktrace_error (void *data, const char *errmsg, int errnum) const auto sig_write = [] (const char *msg) -> void { - gdb_stderr->write_async_safe (msg, strlen (msg)); + if (gdb_stderr == nullptr || gdb_stderr->fd () == -1) + std::ignore = ::write (2, msg, strlen (msg)); + else + gdb_stderr->write_async_safe (msg, strlen (msg)); }; sig_write ("error creating backtrace: "); @@ -79,7 +82,10 @@ libbacktrace_print (void *data, uintptr_t pc, const char *filename, { const auto sig_write = [] (const char *msg) -> void { - gdb_stderr->write_async_safe (msg, strlen (msg)); + if (gdb_stderr == nullptr || gdb_stderr->fd () == -1) + std::ignore = ::write (2, msg, strlen (msg)); + else + gdb_stderr->write_async_safe (msg, strlen (msg)); }; /* Buffer to print addresses and line numbers into. An 8-byte address @@ -130,14 +136,20 @@ gdb_internal_backtrace_1 () { const auto sig_write = [] (const char *msg) -> void { - gdb_stderr->write_async_safe (msg, strlen (msg)); + if (gdb_stderr == nullptr || gdb_stderr->fd () == -1) + std::ignore = ::write (2, msg, strlen (msg)); + else + gdb_stderr->write_async_safe (msg, strlen (msg)); }; /* Allow up to 25 frames of backtrace. */ void *buffer[25]; int frames = backtrace (buffer, ARRAY_SIZE (buffer)); - backtrace_symbols_fd (buffer, frames, gdb_stderr->fd ()); + int fd = ((gdb_stderr == nullptr || gdb_stderr->fd () == -1) + ? 2 + : gdb_stderr->fd ()); + backtrace_symbols_fd (buffer, frames, fd); if (frames == ARRAY_SIZE (buffer)) sig_write (_("Backtrace might be incomplete.\n")); } @@ -173,15 +185,15 @@ gdb_internal_backtrace () #ifdef GDB_PRINT_INTERNAL_BACKTRACE const auto sig_write = [] (const char *msg) -> void { - gdb_stderr->write_async_safe (msg, strlen (msg)); + if (gdb_stderr == nullptr || gdb_stderr->fd () == -1) + std::ignore = ::write (2, msg, strlen (msg)); + else + gdb_stderr->write_async_safe (msg, strlen (msg)); }; sig_write (str_backtrace); - if (gdb_stderr->fd () > -1) - gdb_internal_backtrace_1 (); - else - sig_write (str_backtrace_unavailable); + gdb_internal_backtrace_1 (); sig_write ("---------------------\n"); #endif diff --git a/gdb/event-top.c b/gdb/event-top.c index c533e74811d..0c4e06b7749 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -982,7 +982,10 @@ handle_fatal_signal (int sig) #ifdef GDB_PRINT_INTERNAL_BACKTRACE const auto sig_write = [] (const char *msg) -> void { - gdb_stderr->write_async_safe (msg, strlen (msg)); + if (gdb_stderr == nullptr || gdb_stderr->fd () == -1) + std::ignore = ::write (2, msg, strlen (msg)); + else + gdb_stderr->write_async_safe (msg, strlen (msg)); }; if (bt_on_fatal_signal) @@ -1027,7 +1030,13 @@ handle_fatal_signal (int sig) } sig_write ("\n\n"); - gdb_stderr->flush (); + if (gdb_stderr == nullptr || gdb_stderr->fd () == -1) + { + /* Writing to file descriptor instead of stream, no flush + required. */ + } + else + gdb_stderr->flush (); } #endif -- 2.43.0