Fix sigaltstack decoder
strace used to hang when decoding sigaltstack called with invalid stack_t pointers because of mishandling umove() return code. * signal.c (print_stack_t): Handle unfetchable stack_t properly. Change return type to void. (sys_sigaltstack): Update print_stack_t() usage. Reported-by: kawillia@ucalgary.ca
This commit is contained in:
parent
0cf04b6595
commit
338c069e69
28
signal.c
28
signal.c
@ -1015,33 +1015,31 @@ static const struct xlat sigaltstack_flags[] = {
|
||||
{ 0, NULL },
|
||||
};
|
||||
|
||||
static int
|
||||
static void
|
||||
print_stack_t(struct tcb *tcp, unsigned long addr)
|
||||
{
|
||||
stack_t ss;
|
||||
if (umove(tcp, addr, &ss) < 0)
|
||||
return -1;
|
||||
tprintf("{ss_sp=%#lx, ss_flags=", (unsigned long) ss.ss_sp);
|
||||
printflags(sigaltstack_flags, ss.ss_flags, "SS_???");
|
||||
tprintf(", ss_size=%lu}", (unsigned long) ss.ss_size);
|
||||
return 0;
|
||||
|
||||
if (!addr) {
|
||||
tprints("NULL");
|
||||
} else if (umove(tcp, addr, &ss) < 0) {
|
||||
tprintf("%#lx", addr);
|
||||
} else {
|
||||
tprintf("{ss_sp=%#lx, ss_flags=", (unsigned long) ss.ss_sp);
|
||||
printflags(sigaltstack_flags, ss.ss_flags, "SS_???");
|
||||
tprintf(", ss_size=%lu}", (unsigned long) ss.ss_size);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sys_sigaltstack(struct tcb *tcp)
|
||||
{
|
||||
if (entering(tcp)) {
|
||||
if (tcp->u_arg[0] == 0)
|
||||
tprints("NULL");
|
||||
else if (print_stack_t(tcp, tcp->u_arg[0]) < 0)
|
||||
return -1;
|
||||
print_stack_t(tcp, tcp->u_arg[0]);
|
||||
}
|
||||
else {
|
||||
tprints(", ");
|
||||
if (tcp->u_arg[1] == 0)
|
||||
tprints("NULL");
|
||||
else if (print_stack_t(tcp, tcp->u_arg[1]) < 0)
|
||||
return -1;
|
||||
print_stack_t(tcp, tcp->u_arg[1]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user