Change maybe_disable_address_space_randomization to a class

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-26  Tom Tromey  <tom@tromey.com>

	* 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-26  Tom Tromey  <tom@tromey.com>

	* linux-low.c (linux_create_inferior): Update.
This commit is contained in:
Tom Tromey 2017-11-22 09:30:21 -07:00
parent 44287fd890
commit 41272101db
6 changed files with 72 additions and 67 deletions

View File

@ -1,3 +1,15 @@
2017-11-26 Tom Tromey <tom@tromey.com>
* 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.
2017-11-26 Tom Tromey <tom@tromey.com>
* gcore.c (write_gcore_file_1): Use gdb::unique_xmalloc_ptr.

View File

@ -1,3 +1,7 @@
2017-11-26 Tom Tromey <tom@tromey.com>
* linux-low.c (linux_create_inferior): Update.
2017-11-24 Ulrich Weigand <uweigand@de.ibm.com>
* spu-low.c (spu_create_inferior): Fix typo in argument name.

View File

@ -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);
{
maybe_disable_address_space_randomization restore_personality
(disable_randomization);
std::string str_program_args = stringify_argv (program_args);
do_cleanups (restore_personality);
pid = fork_inferior (program,
str_program_args.c_str (),
get_environ ()->envp (), linux_ptrace_fun,
NULL, NULL, NULL, NULL);
}
linux_add_process (pid, 0);

View File

@ -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

View File

@ -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 */
return make_disable_asr_cleanup (personality_set,
personality_orig);
}
maybe_disable_address_space_randomization::
~maybe_disable_address_space_randomization ()
{
#ifdef HAVE_PERSONALITY
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 */
}

View File

@ -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
<sys/personality.h>. 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
<sys/personality.h>. */
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 */