Pull align-sig-frame into release branch
This commit is contained in:
Коммит
64de57ffd3
|
@ -387,15 +387,14 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,
|
||||||
struct sigscratch *scr)
|
struct sigscratch *scr)
|
||||||
{
|
{
|
||||||
extern char __kernel_sigtramp[];
|
extern char __kernel_sigtramp[];
|
||||||
unsigned long tramp_addr, new_rbs = 0;
|
unsigned long tramp_addr, new_rbs = 0, new_sp;
|
||||||
struct sigframe __user *frame;
|
struct sigframe __user *frame;
|
||||||
long err;
|
long err;
|
||||||
|
|
||||||
frame = (void __user *) scr->pt.r12;
|
new_sp = scr->pt.r12;
|
||||||
tramp_addr = (unsigned long) __kernel_sigtramp;
|
tramp_addr = (unsigned long) __kernel_sigtramp;
|
||||||
if ((ka->sa.sa_flags & SA_ONSTACK) && sas_ss_flags((unsigned long) frame) == 0) {
|
if ((ka->sa.sa_flags & SA_ONSTACK) && sas_ss_flags(new_sp) == 0) {
|
||||||
frame = (void __user *) ((current->sas_ss_sp + current->sas_ss_size)
|
new_sp = current->sas_ss_sp + current->sas_ss_size;
|
||||||
& ~(STACK_ALIGN - 1));
|
|
||||||
/*
|
/*
|
||||||
* We need to check for the register stack being on the signal stack
|
* We need to check for the register stack being on the signal stack
|
||||||
* separately, because it's switched separately (memory stack is switched
|
* separately, because it's switched separately (memory stack is switched
|
||||||
|
@ -404,7 +403,7 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,
|
||||||
if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
|
if (!rbs_on_sig_stack(scr->pt.ar_bspstore))
|
||||||
new_rbs = (current->sas_ss_sp + sizeof(long) - 1) & ~(sizeof(long) - 1);
|
new_rbs = (current->sas_ss_sp + sizeof(long) - 1) & ~(sizeof(long) - 1);
|
||||||
}
|
}
|
||||||
frame = (void __user *) frame - ((sizeof(*frame) + STACK_ALIGN - 1) & ~(STACK_ALIGN - 1));
|
frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN);
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
|
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
|
||||||
return force_sigsegv_info(sig, frame);
|
return force_sigsegv_info(sig, frame);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче