signal/arc: siginfo cleanups
Subsystems (2)
cover signal/arc: siginfo cleanups
I have been slowly cleaning up the architectues ever since I discovered that the pattern of passing in struct siginfo is error prone, and occassionally results in borken siginfo being sent to userspace.
What is happening on arc is pretty tame and I have compile tested these changes, so I don't expect problems.
Still I would appreciate if people can look over the code and perhaps test it and see if they can spot anything that has perhaps gone wrong. appreciate it.
My intention is to merge this through my siginfo tree. If you feel it
should go through your arch tree let me know. All of the prerequisites
should have been merged several releases ago.
Eric W. Biederman (2):
signal/arc: Push siginfo generation into unhandled_exception signal/arc: Use force_sig_fault where appropriate
arch/arc/kernel/traps.c | 22 ++++++++-------------- arch/arc/mm/fault.c | 20 +++++--------------- 2 files changed, 13 insertions(+), 29 deletions(-)
PATCH 1/2 signal/arc: Push siginfo generation into unhandled_exception
Pass signr, sicode, and address into unhandled_exception as explicit parameters instead of members of struct siginfo. Then in unhandled exception generate and send the siginfo using force_sig_fault.
This keeps the code simpler and less error prone.
--- arch/arc/kernel/traps.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-)
arch/arc/kernel/traps.c +8 -14
@@ -42,21 +42,22 @@ void die(const char *str, struct pt_regs *regs, unsigned long address)* -for kernel, chk if due to copy_(to|from)_user, otherwise die() */ static noinline int -unhandled_exception (const char *str,struct pt_regs *regs,siginfo_t *info) +unhandled_exception (const char *str,struct pt_regs *regs, +int signo,int si_code,void __user *addr) {if (user_mode (regs)) {struct task_struct *tsk = current; - tsk->thread.fault_address = (__force unsigned int )info->si_addr; + tsk->thread.fault_address = (__force unsigned int )addr; -force_sig_info (info->si_signo, info, tsk); +force_sig_fault (signo, si_code, addr, tsk); }else {/* If not due to copy_(to|from)_user, we are doomed */ if (fixup_exception (regs))return 0 ; -die (str, regs, (unsigned long )info->si_addr); +die (str, regs, (unsigned long )addr); }return 1 ;
@@ -64,16 +65,9 @@ unhandled_exception(const char *str, struct pt_regs *regs, siginfo_t *info)#define DO_ERROR_INFO (signr, str, name, sicode) \ int name(unsigned long address, struct pt_regs *regs) \ -{ \ - siginfo_t info; \ - \ - clear_siginfo(&info); \ - info.si_signo = signr; \ - info.si_errno = 0; \ - info.si_code = sicode; \ - info.si_addr = (void __user *)address; \ - \ - return unhandled_exception(str, regs, &info);\ +{ \ + return unhandled_exception(str, regs, signr, sicode, \ + (void __user *)address); \ }/*
Signature · 1 line
2.17.1
Re: [REVIEW][PATCH 1/2] signal/arc: Push siginfo generation into unhandled_exception
Quoted 7 lines · Eric W. Biederman
Pass signr, sicode, and address into
unhandled_exceptionas explicit parameters instead of members of struct siginfo. Then in unhandled exception generate and send the siginfo usingforce_sig_fault.This keeps the code simpler and less error prone.
Signed-off-by "Eric W. Biederman" <[email protected]>
LGTM.
Thx,
-Vineet
PATCH 2/2 signal/arc: Use force_sig_fault where appropriate
In reply to Eric W. Biederman--- arch/arc/mm/fault.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-)
arch/arc/mm/fault.c +5 -15
@@ -66,14 +66,12 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)struct vm_area_struct *vma =NULL ;struct task_struct *tsk = current;struct mm_struct *mm = tsk->mm; -siginfo_t info; +int si_code;int ret;vm_fault_t fault;int write = regs->ecr_cause &ECR_C_PROTV_STORE ;/* ST/EX */ unsigned int flags =FAULT_FLAG_ALLOW_RETRY |FAULT_FLAG_KILLABLE ; -clear_siginfo (&info); -/* * We fault-in kernel-space virtual memory on-demand. The * 'reference' page table is init_mm.pgd.
@@ -91,7 +89,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)return ; } - info.si_code =SEGV_MAPERR ; + si_code =SEGV_MAPERR ;/* * If we're in an interrupt or have no user
@@ -119,7 +117,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)* we can handle it.. */ good_area: - info.si_code =SEGV_ACCERR ; + si_code =SEGV_ACCERR ;/* Handle protection violation, execute on heap or stack */
@@ -199,11 +197,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)/* User mode accesses just cause a SIGSEGV */ if (user_mode (regs)) { tsk->thread.fault_address = address; - info.si_signo =SIGSEGV ; - info.si_errno =0 ; -/* info.si_code has been set above */ - info.si_addr = (void __user *)address; -force_sig_info (SIGSEGV , &info, tsk); +force_sig_fault (SIGSEGV , si_code, (void __user *)address, tsk);return ; }
@@ -238,9 +232,5 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) goto no_context; tsk->thread.fault_address = address; - info.si_signo =SIGBUS ; - info.si_errno =0 ; - info.si_code =BUS_ADRERR ; - info.si_addr = (void __user *)address; -force_sig_info (SIGBUS , &info, tsk); +force_sig_fault (SIGBUS ,BUS_ADRERR , (void __user *)address, tsk); }
Signature · 1 line
2.17.1
Re: [REVIEW][PATCH 2/2] signal/arc: Use force_sig_fault where appropriate
Quoted 1 line · Eric W. Biederman
Signed-off-by "Eric W. Biederman" <[email protected]>
Thx,
-Vineet