From patchwork Tue Oct 1 20:12:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 34779 Received: (qmail 42394 invoked by alias); 1 Oct 2019 20:12:45 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 42321 invoked by uid 89); 1 Oct 2019 20:12:45 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_HELO_PASS autolearn=ham version=3.3.1 spammy=Temporarily, HX-Spam-Relays-External:192.185.51.122, H*RU:192.185.51.122 X-HELO: gateway24.websitewelcome.com Received: from gateway24.websitewelcome.com (HELO gateway24.websitewelcome.com) (192.185.51.122) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 01 Oct 2019 20:12:42 +0000 Received: from cm17.websitewelcome.com (cm17.websitewelcome.com [100.42.49.20]) by gateway24.websitewelcome.com (Postfix) with ESMTP id 3301A742C2 for ; Tue, 1 Oct 2019 15:12:34 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id FOVei2dE3PUvSFOVeighLa; Tue, 01 Oct 2019 15:12:34 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=0mJ0CXWeiDiATg5k9VLWT3VDh7lfVJtPmUMjOYOrEfk=; b=gIC1JtzFcrkr7quionkiSDoMFc 1u4CEw6d6a6OzedbUhkaNoldPsPgqZg+g+K6HYukDXyG7grQ81ivN7ZMBpByHCKimLyeEkdAcIpj+ WehF5ZS0AuetcjRN0+jDeI4+z; Received: from 75-166-72-156.hlrn.qwest.net ([75.166.72.156]:47310 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.92) (envelope-from ) id 1iFOVe-0023p5-Cv; Tue, 01 Oct 2019 14:12:34 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH v4 05/11] Introduce alternate_signal_stack RAII class Date: Tue, 1 Oct 2019 14:12:21 -0600 Message-Id: <20191001201227.8519-6-tom@tromey.com> In-Reply-To: <20191001201227.8519-1-tom@tromey.com> References: <20191001201227.8519-1-tom@tromey.com> This introduces a new RAII class that temporarily installs an alternate signal stack (on systems that have sigaltstack); then changes the one gdb use of sigaltstack to use this class instead. This will be used in a later patch, when creating new threads that may want to handle SIGSEGV. gdb/ChangeLog 2019-10-01 Tom Tromey * main.c (setup_alternate_signal_stack): Remove. (captured_main_1): Use gdb::alternate_signal_stack. * gdbsupport/alt-stack.h: New file. --- gdb/ChangeLog | 6 ++++ gdb/gdbsupport/alt-stack.h | 70 ++++++++++++++++++++++++++++++++++++++ gdb/main.c | 26 ++------------ 3 files changed, 78 insertions(+), 24 deletions(-) create mode 100644 gdb/gdbsupport/alt-stack.h diff --git a/gdb/gdbsupport/alt-stack.h b/gdb/gdbsupport/alt-stack.h new file mode 100644 index 00000000000..1708fb4ce92 --- /dev/null +++ b/gdb/gdbsupport/alt-stack.h @@ -0,0 +1,70 @@ +/* Temporarily install an alternate signal stack + + Copyright (C) 2019 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#ifndef GDBSUPPORT_ALT_STACK_H +#define GDBSUPPORT_ALT_STACK_H + +#include + +namespace gdb +{ + +/* Try to set up an alternate signal stack for SIGSEGV handlers. + This allows us to handle SIGSEGV signals generated when the + normal process stack is exhausted. If this stack is not set + up (sigaltstack is unavailable or fails) and a SIGSEGV is + generated when the normal stack is exhausted then the program + will behave as though no SIGSEGV handler was installed. */ +class alternate_signal_stack +{ +public: + alternate_signal_stack () + { +#ifdef HAVE_SIGALTSTACK + m_stack.reset ((char *) xmalloc (SIGSTKSZ)); + + stack_t stack; + stack.ss_sp = m_stack.get (); + stack.ss_size = SIGSTKSZ; + stack.ss_flags = 0; + + sigaltstack (&stack, &m_old_stack); +#endif + } + + ~alternate_signal_stack () + { +#ifdef HAVE_SIGALTSTACK + sigaltstack (&m_old_stack, nullptr); +#endif + } + + DISABLE_COPY_AND_ASSIGN (alternate_signal_stack); + +private: + +#ifdef HAVE_SIGALTSTACK + gdb::unique_xmalloc_ptr m_stack; + stack_t m_old_stack; +#endif +}; + +} + +#endif /* GDBSUPPORT_ALT_STACK_H */ diff --git a/gdb/main.c b/gdb/main.c index 14d9e796538..5f6e8bec86e 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -48,6 +48,7 @@ #include #include "gdbsupport/pathstuff.h" #include "cli/cli-style.h" +#include "gdbsupport/alt-stack.h" /* The selected interpreter. This will be used as a set command variable, so it should always be malloc'ed - since @@ -289,29 +290,6 @@ get_init_files (std::string *system_gdbinit, *local_gdbinit = localinit; } -/* Try to set up an alternate signal stack for SIGSEGV handlers. - This allows us to handle SIGSEGV signals generated when the - normal process stack is exhausted. If this stack is not set - up (sigaltstack is unavailable or fails) and a SIGSEGV is - generated when the normal stack is exhausted then the program - will behave as though no SIGSEGV handler was installed. */ - -static void -setup_alternate_signal_stack (void) -{ -#ifdef HAVE_SIGALTSTACK - stack_t ss; - - /* FreeBSD versions older than 11.0 use char * for ss_sp instead of - void *. This cast works with both types. */ - ss.ss_sp = (char *) xmalloc (SIGSTKSZ); - ss.ss_size = SIGSTKSZ; - ss.ss_flags = 0; - - sigaltstack(&ss, NULL); -#endif -} - /* Call command_loop. */ /* Prevent inlining this function for the benefit of GDB's selftests @@ -857,7 +835,7 @@ captured_main_1 (struct captured_main_args *context) save_original_signals_state (quiet); /* Try to set up an alternate signal stack for SIGSEGV handlers. */ - setup_alternate_signal_stack (); + gdb::alternate_signal_stack signal_stack; /* Initialize all files. */ gdb_init (gdb_program_name);