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:
parent
44287fd890
commit
41272101db
6 changed files with 72 additions and 67 deletions
|
@ -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>
|
2017-11-26 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
* gcore.c (write_gcore_file_1): Use gdb::unique_xmalloc_ptr.
|
* gcore.c (write_gcore_file_1): Use gdb::unique_xmalloc_ptr.
|
||||||
|
|
|
@ -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>
|
2017-11-24 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
* spu-low.c (spu_create_inferior): Fix typo in argument name.
|
* spu-low.c (spu_create_inferior): Fix typo in argument name.
|
||||||
|
|
|
@ -998,16 +998,17 @@ linux_create_inferior (const char *program,
|
||||||
struct lwp_info *new_lwp;
|
struct lwp_info *new_lwp;
|
||||||
int pid;
|
int pid;
|
||||||
ptid_t ptid;
|
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 (),
|
maybe_disable_address_space_randomization restore_personality
|
||||||
get_environ ()->envp (), linux_ptrace_fun,
|
(disable_randomization);
|
||||||
NULL, NULL, NULL, NULL);
|
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);
|
linux_add_process (pid, 0);
|
||||||
|
|
||||||
|
|
|
@ -1118,8 +1118,8 @@ linux_nat_create_inferior (struct target_ops *ops,
|
||||||
const char *exec_file, const std::string &allargs,
|
const char *exec_file, const std::string &allargs,
|
||||||
char **env, int from_tty)
|
char **env, int from_tty)
|
||||||
{
|
{
|
||||||
struct cleanup *restore_personality
|
maybe_disable_address_space_randomization restore_personality
|
||||||
= maybe_disable_address_space_randomization (disable_randomization);
|
(disable_randomization);
|
||||||
|
|
||||||
/* The fork_child mechanism is synchronous and calls target_wait, so
|
/* The fork_child mechanism is synchronous and calls target_wait, so
|
||||||
we have to mask the async mode. */
|
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_nat_pass_signals (ops, 0, NULL);
|
||||||
|
|
||||||
linux_ops->to_create_inferior (ops, exec_file, allargs, env, from_tty);
|
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
|
/* Callback for linux_proc_attach_tgid_threads. Attach to PTID if not
|
||||||
|
|
|
@ -27,68 +27,43 @@
|
||||||
# endif /* ! HAVE_DECL_ADDR_NO_RANDOMIZE */
|
# endif /* ! HAVE_DECL_ADDR_NO_RANDOMIZE */
|
||||||
#endif /* HAVE_PERSONALITY */
|
#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. */
|
/* See comment on nat/linux-personality.h. */
|
||||||
|
|
||||||
struct cleanup *
|
maybe_disable_address_space_randomization::
|
||||||
maybe_disable_address_space_randomization (int disable_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
|
#ifdef HAVE_PERSONALITY
|
||||||
if (disable_randomization)
|
if (disable_randomization)
|
||||||
{
|
{
|
||||||
errno = 0;
|
errno = 0;
|
||||||
personality_orig = personality (0xffffffff);
|
m_personality_orig = personality (0xffffffff);
|
||||||
if (errno == 0 && !(personality_orig & ADDR_NO_RANDOMIZE))
|
if (errno == 0 && !(m_personality_orig & ADDR_NO_RANDOMIZE))
|
||||||
{
|
{
|
||||||
personality_set = 1;
|
m_personality_set = true;
|
||||||
personality (personality_orig | ADDR_NO_RANDOMIZE);
|
personality (m_personality_orig | ADDR_NO_RANDOMIZE);
|
||||||
}
|
}
|
||||||
if (errno != 0 || (personality_set
|
if (errno != 0 || (m_personality_set
|
||||||
&& !(personality (0xffffffff) & ADDR_NO_RANDOMIZE)))
|
&& !(personality (0xffffffff) & ADDR_NO_RANDOMIZE)))
|
||||||
warning (_("Error disabling address space randomization: %s"),
|
warning (_("Error disabling address space randomization: %s"),
|
||||||
safe_strerror (errno));
|
safe_strerror (errno));
|
||||||
}
|
}
|
||||||
#endif /* HAVE_PERSONALITY */
|
#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 */
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,12 +20,27 @@
|
||||||
#ifndef NAT_LINUX_PERSONALITY_H
|
#ifndef NAT_LINUX_PERSONALITY_H
|
||||||
#define NAT_LINUX_PERSONALITY_H
|
#define NAT_LINUX_PERSONALITY_H
|
||||||
|
|
||||||
/* Disable the inferior's address space randomization if
|
class maybe_disable_address_space_randomization
|
||||||
DISABLE_RANDOMIZATION is not zero and if we have
|
{
|
||||||
<sys/personality.h>. Return a cleanup which, when called, will
|
public:
|
||||||
re-enable the inferior's address space randomization. */
|
|
||||||
|
|
||||||
extern struct cleanup *maybe_disable_address_space_randomization
|
/* Disable the inferior's address space randomization if
|
||||||
(int disable_randomization);
|
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 */
|
#endif /* ! NAT_LINUX_PERSONALITY_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue