[gdb/tdep] Handle si_addr_bnd in compat_siginfo_from_siginfo

When running test-case gdb.arch/i386-mpx-sigsegv.exp with target board
unix/-m32, we run into:
...
(gdb) continue^M
Continuing.^M
Saw a #BR! status 1 at 0x8048c2d^M
^M
Program received signal SIGSEGV, Segmentation fault^M
Upper bound violation while accessing address 0x0804c15c^M
Bounds: [lower = 0x00000000, upper = 0x00000000].^M
0x08048a4f in lower (p=0x804c160, a=0x804c180, b=0x804c1a0, c=0x804c1c0, \
  d=0x804c1e0, len=1) at i386-mpx-sigsegv.c:79^M
79        value = *(p - len);^M
(gdb) FAIL: gdb.arch/i386-mpx-sigsegv.exp: MPX signal segv Lower: 0
...

The problem is that lower and upper in the Bounds message are 0x0, which is
caused by $_siginfo._sifields._sigfault._addr_bnd.{_lower,_upper} evaluating
to 0x0.

Fix this by copying the si_lower/si_upper fields in
compat_siginfo_from_siginfo.

Tested on x86_64-linux, with target board unix/-m32.

gdb/ChangeLog:

2021-01-18  Tom de Vries  <tdevries@suse.de>

	PR tdep/27172
	* nat/amd64-linux-siginfo.c (cpt_si_lower, cpt_si_upper, SEGV_BNDERR):
	New macro.
	(compat_siginfo_from_siginfo): Copy cpt_si_lower and cpt_si_upper
	for SEGV_BNDERR.
This commit is contained in:
Tom de Vries 2021-01-18 09:32:38 +01:00
parent aa2838ccc5
commit d3d7d1ba3b
2 changed files with 21 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2021-01-18 Tom de Vries <tdevries@suse.de>
PR tdep/27172
* nat/amd64-linux-siginfo.c (cpt_si_lower, cpt_si_upper, SEGV_BNDERR):
New macro.
(compat_siginfo_from_siginfo): Copy cpt_si_lower and cpt_si_upper
for SEGV_BNDERR.
2021-01-18 Simon Marchi <simon.marchi@polymtl.ca>
* remote.c (class remote_target) <remote_hostio_send_command,

View File

@ -277,6 +277,8 @@ typedef struct compat_x32_siginfo
#define cpt_si_ptr _sifields._rt._sigval.sival_ptr
#define cpt_si_addr _sifields._sigfault._addr
#define cpt_si_addr_lsb _sifields._sigfault._addr_lsb
#define cpt_si_lower _sifields._sigfault.si_addr_bnd._lower
#define cpt_si_upper _sifields._sigfault.si_addr_bnd._upper
#define cpt_si_band _sifields._sigpoll._band
#define cpt_si_fd _sifields._sigpoll._fd
@ -290,6 +292,10 @@ typedef struct compat_x32_siginfo
#define si_overrun si_timer2
#endif
#ifndef SEGV_BNDERR
#define SEGV_BNDERR 3
#endif
/* The type of the siginfo object the kernel returns in
PTRACE_GETSIGINFO. If gdb is built as a x32 program, we get a x32
siginfo. */
@ -324,6 +330,13 @@ compat_siginfo_from_siginfo (compat_siginfo_t *to, const siginfo_t *from)
to->cpt_si_pid = from_ptrace.cpt_si_pid;
to->cpt_si_uid = from_ptrace.cpt_si_uid;
}
else if (to->si_code == SEGV_BNDERR
&& to->si_signo == SIGSEGV)
{
to->cpt_si_addr = from_ptrace.cpt_si_addr;
to->cpt_si_lower = from_ptrace.cpt_si_lower;
to->cpt_si_upper = from_ptrace.cpt_si_upper;
}
else if (to->si_code < 0)
{
to->cpt_si_pid = from_ptrace.cpt_si_pid;