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
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue