From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30800 invoked by alias); 25 Nov 2017 21:11:19 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 30789 invoked by uid 89); 25 Nov 2017 21:11:18 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.6 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KB_WAM_FROM_NAME_SINGLEWORD,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=2768, sk:persona X-HELO: gateway24.websitewelcome.com Received: from gateway24.websitewelcome.com (HELO gateway24.websitewelcome.com) (192.185.50.252) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 25 Nov 2017 21:11:16 +0000 Received: from cm16.websitewelcome.com (cm16.websitewelcome.com [100.42.49.19]) by gateway24.websitewelcome.com (Postfix) with ESMTP id 7B512D281 for ; Sat, 25 Nov 2017 15:11:15 -0600 (CST) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id IhjHedaRRRtUXIhjHelTSa; Sat, 25 Nov 2017 15:11:15 -0600 Received: from 71-218-90-63.hlrn.qwest.net ([71.218.90.63]:48412 helo=bapiya.Home) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.89) (envelope-from ) id 1eIhjH-002F7l-7M; Sat, 25 Nov 2017 15:11:15 -0600 From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [RFA] Change maybe_disable_address_space_randomization to a class Date: Sat, 25 Nov 2017 21:11:00 -0000 Message-Id: <20171125211113.31419-1-tom@tromey.com> X-BWhitelist: no X-Source-L: No X-Exim-ID: 1eIhjH-002F7l-7M X-Source-Sender: 71-218-90-63.hlrn.qwest.net (bapiya.Home) [71.218.90.63]:48412 X-Source-Auth: tom+tromey.com X-Email-Count: 1 X-Source-Cap: ZWx5bnJvYmk7ZWx5bnJvYmk7Ym94NTM3OS5ibHVlaG9zdC5jb20= X-Local-Domain: yes X-SW-Source: 2017-11/txt/msg00657.txt.bz2 This changes maybe_disable_address_space_randomization to be an RAII class, rather than having it return a cleanup. Regression tested by the buildbot. ChangeLog 2017-11-25 Tom Tromey * nat/linux-personality.h (class maybe_disable_address_space_randomization): New class. (maybe_disable_address_space_randomization): Don't declare function. * nat/linux-personality.c (restore_personality) (make_disable_asr_cleanup): Remove. (maybe_disable_address_space_randomization): Now a constructor. (~maybe_disable_address_space_randomization): New destructor. * linux-nat.c (linux_nat_create_inferior): Update. gdbserver/ChangeLog 2017-11-25 Tom Tromey * linux-low.c (linux_create_inferior): Update. --- gdb/ChangeLog | 12 ++++++++ gdb/gdbserver/ChangeLog | 4 +++ gdb/gdbserver/linux-low.c | 19 ++++++------ gdb/linux-nat.c | 6 ++-- gdb/nat/linux-personality.c | 71 +++++++++++++++------------------------------ gdb/nat/linux-personality.h | 27 +++++++++++++---- 6 files changed, 72 insertions(+), 67 deletions(-) diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 274263a947..c2420fdf57 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -998,16 +998,17 @@ linux_create_inferior (const char *program, struct lwp_info *new_lwp; int pid; ptid_t ptid; - struct cleanup *restore_personality - = maybe_disable_address_space_randomization (disable_randomization); - std::string str_program_args = stringify_argv (program_args); - pid = fork_inferior (program, - str_program_args.c_str (), - get_environ ()->envp (), linux_ptrace_fun, - NULL, NULL, NULL, NULL); - - do_cleanups (restore_personality); + { + maybe_disable_address_space_randomization restore_personality + (disable_randomization); + std::string str_program_args = stringify_argv (program_args); + + pid = fork_inferior (program, + str_program_args.c_str (), + get_environ ()->envp (), linux_ptrace_fun, + NULL, NULL, NULL, NULL); + } linux_add_process (pid, 0); diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index a6395f4b5e..96cb21a2cf 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -1118,8 +1118,8 @@ linux_nat_create_inferior (struct target_ops *ops, const char *exec_file, const std::string &allargs, char **env, int from_tty) { - struct cleanup *restore_personality - = maybe_disable_address_space_randomization (disable_randomization); + maybe_disable_address_space_randomization restore_personality + (disable_randomization); /* The fork_child mechanism is synchronous and calls target_wait, so we have to mask the async mode. */ @@ -1128,8 +1128,6 @@ linux_nat_create_inferior (struct target_ops *ops, linux_nat_pass_signals (ops, 0, NULL); linux_ops->to_create_inferior (ops, exec_file, allargs, env, from_tty); - - do_cleanups (restore_personality); } /* Callback for linux_proc_attach_tgid_threads. Attach to PTID if not diff --git a/gdb/nat/linux-personality.c b/gdb/nat/linux-personality.c index 21a9ca9d83..bcec2ce5f3 100644 --- a/gdb/nat/linux-personality.c +++ b/gdb/nat/linux-personality.c @@ -27,68 +27,43 @@ # endif /* ! HAVE_DECL_ADDR_NO_RANDOMIZE */ #endif /* HAVE_PERSONALITY */ -#ifdef HAVE_PERSONALITY - -/* Restore address space randomization of the inferior. ARG is the - original inferior's personality value before the address space - randomization was disabled. */ - -static void -restore_personality (void *arg) -{ - int personality_orig = (int) (uintptr_t) arg; - - errno = 0; - personality (personality_orig); - if (errno != 0) - warning (_("Error restoring address space randomization: %s"), - safe_strerror (errno)); -} -#endif /* HAVE_PERSONALITY */ - -/* Return a cleanup responsible for restoring the inferior's - personality (and restoring the inferior's address space - randomization) if HAVE_PERSONALITY and if PERSONALITY_SET is not - zero; return a null cleanup if not HAVE_PERSONALITY or if - PERSONALITY_SET is zero. */ - -static struct cleanup * -make_disable_asr_cleanup (int personality_set, int personality_orig) -{ -#ifdef HAVE_PERSONALITY - if (personality_set != 0) - return make_cleanup (restore_personality, - (void *) (uintptr_t) personality_orig); -#endif /* HAVE_PERSONALITY */ - - return make_cleanup (null_cleanup, NULL); -} - /* See comment on nat/linux-personality.h. */ -struct cleanup * +maybe_disable_address_space_randomization:: maybe_disable_address_space_randomization (int disable_randomization) + : m_personality_set (false), + m_personality_orig (0) { - int personality_orig = 0; - int personality_set = 0; - #ifdef HAVE_PERSONALITY if (disable_randomization) { errno = 0; - personality_orig = personality (0xffffffff); - if (errno == 0 && !(personality_orig & ADDR_NO_RANDOMIZE)) + m_personality_orig = personality (0xffffffff); + if (errno == 0 && !(m_personality_orig & ADDR_NO_RANDOMIZE)) { - personality_set = 1; - personality (personality_orig | ADDR_NO_RANDOMIZE); + m_personality_set = true; + personality (m_personality_orig | ADDR_NO_RANDOMIZE); } - if (errno != 0 || (personality_set + if (errno != 0 || (m_personality_set && !(personality (0xffffffff) & ADDR_NO_RANDOMIZE))) warning (_("Error disabling address space randomization: %s"), safe_strerror (errno)); } #endif /* HAVE_PERSONALITY */ +} + +maybe_disable_address_space_randomization:: +~maybe_disable_address_space_randomization () +{ +#ifdef HAVE_PERSONALITY - return make_disable_asr_cleanup (personality_set, - personality_orig); + if (m_personality_set) + { + errno = 0; + personality (m_personality_orig); + if (errno != 0) + warning (_("Error restoring address space randomization: %s"), + safe_strerror (errno)); + } +#endif /* HAVE_PERSONALITY */ } diff --git a/gdb/nat/linux-personality.h b/gdb/nat/linux-personality.h index 687086e68b..fcea02a67d 100644 --- a/gdb/nat/linux-personality.h +++ b/gdb/nat/linux-personality.h @@ -20,12 +20,27 @@ #ifndef NAT_LINUX_PERSONALITY_H #define NAT_LINUX_PERSONALITY_H -/* Disable the inferior's address space randomization if - DISABLE_RANDOMIZATION is not zero and if we have - . Return a cleanup which, when called, will - re-enable the inferior's address space randomization. */ +class maybe_disable_address_space_randomization +{ +public: -extern struct cleanup *maybe_disable_address_space_randomization - (int disable_randomization); + /* Disable the inferior's address space randomization if + DISABLE_RANDOMIZATION is not zero and if we have + . */ + maybe_disable_address_space_randomization (int disable_randomization); + + /* On destruction, re-enable address space randomization. */ + ~maybe_disable_address_space_randomization (); + + DISABLE_COPY_AND_ASSIGN (maybe_disable_address_space_randomization); + +private: + + /* True if the personality was set in the constructor. */ + bool m_personality_set; + + /* If m_personality_set is true, the original personality value. */ + int m_personality_orig; +}; #endif /* ! NAT_LINUX_PERSONALITY_H */ -- 2.13.6