summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2018-04-17 16:26:37 -0400
committerEric W. Biederman <ebiederm@xmission.com>2018-04-25 11:40:51 -0400
commit3eb0f5193b497083391aa05d35210d5645211eef (patch)
tree65f009d4cdd5e407741a4431c0aacd40452779bd
parentf6ed1ecad56fec7ab5c6bf741064b95801e9688f (diff)
signal: Ensure every siginfo we send has all bits initialized
Call clear_siginfo to ensure every stack allocated siginfo is properly initialized before being passed to the signal sending functions. Note: It is not safe to depend on C initializers to initialize struct siginfo on the stack because C is allowed to skip holes when initializing a structure. The initialization of struct siginfo in tracehook_report_syscall_exit was moved from the helper user_single_step_siginfo into tracehook_report_syscall_exit itself, to make it clear that the local variable siginfo gets fully initialized. In a few cases the scope of struct siginfo has been reduced to make it clear that siginfo siginfo is not used on other paths in the function in which it is declared. Instances of using memset to initialize siginfo have been replaced with calls clear_siginfo for clarity. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
-rw-r--r--arch/alpha/kernel/osf_sys.c1
-rw-r--r--arch/alpha/kernel/signal.c2
-rw-r--r--arch/alpha/kernel/traps.c5
-rw-r--r--arch/alpha/mm/fault.c2
-rw-r--r--arch/arc/mm/fault.c2
-rw-r--r--arch/arm/kernel/ptrace.c1
-rw-r--r--arch/arm/kernel/swp_emulate.c1
-rw-r--r--arch/arm/kernel/traps.c5
-rw-r--r--arch/arm/mm/alignment.c1
-rw-r--r--arch/arm/mm/fault.c4
-rw-r--r--arch/arm/vfp/vfpmodule.c3
-rw-r--r--arch/arm64/kernel/fpsimd.c2
-rw-r--r--arch/arm64/kernel/sys_compat.c1
-rw-r--r--arch/arm64/kernel/traps.c1
-rw-r--r--arch/arm64/mm/fault.c18
-rw-r--r--arch/c6x/kernel/traps.c1
-rw-r--r--arch/hexagon/kernel/traps.c1
-rw-r--r--arch/hexagon/mm/vm_fault.c1
-rw-r--r--arch/ia64/kernel/brl_emu.c1
-rw-r--r--arch/ia64/kernel/signal.c2
-rw-r--r--arch/ia64/kernel/traps.c27
-rw-r--r--arch/ia64/kernel/unaligned.c1
-rw-r--r--arch/ia64/mm/fault.c4
-rw-r--r--arch/m68k/kernel/traps.c2
-rw-r--r--arch/microblaze/kernel/exceptions.c1
-rw-r--r--arch/microblaze/mm/fault.c4
-rw-r--r--arch/mips/mm/fault.c1
-rw-r--r--arch/nds32/kernel/traps.c3
-rw-r--r--arch/nds32/mm/fault.c1
-rw-r--r--arch/nios2/kernel/traps.c1
-rw-r--r--arch/openrisc/kernel/traps.c5
-rw-r--r--arch/openrisc/mm/fault.c1
-rw-r--r--arch/parisc/kernel/ptrace.c1
-rw-r--r--arch/parisc/kernel/traps.c2
-rw-r--r--arch/parisc/kernel/unaligned.c1
-rw-r--r--arch/parisc/math-emu/driver.c1
-rw-r--r--arch/parisc/mm/fault.c1
-rw-r--r--arch/powerpc/kernel/process.c1
-rw-r--r--arch/powerpc/kernel/traps.c3
-rw-r--r--arch/powerpc/mm/fault.c1
-rw-r--r--arch/powerpc/platforms/cell/spufs/fault.c2
-rw-r--r--arch/riscv/kernel/traps.c1
-rw-r--r--arch/s390/kernel/traps.c5
-rw-r--r--arch/s390/mm/fault.c2
-rw-r--r--arch/sh/kernel/traps_32.c2
-rw-r--r--arch/sh/math-emu/math.c1
-rw-r--r--arch/sh/mm/fault.c1
-rw-r--r--arch/sparc/kernel/process_64.c1
-rw-r--r--arch/sparc/kernel/sys_sparc_32.c1
-rw-r--r--arch/sparc/kernel/traps_32.c10
-rw-r--r--arch/sparc/kernel/traps_64.c14
-rw-r--r--arch/sparc/kernel/unaligned_32.c1
-rw-r--r--arch/sparc/mm/fault_32.c1
-rw-r--r--arch/sparc/mm/fault_64.c1
-rw-r--r--arch/um/kernel/trap.c2
-rw-r--r--arch/unicore32/kernel/fpu-ucf64.c2
-rw-r--r--arch/unicore32/mm/fault.c3
-rw-r--r--arch/x86/entry/vsyscall/vsyscall_64.c2
-rw-r--r--arch/x86/kernel/ptrace.c2
-rw-r--r--arch/x86/kernel/traps.c3
-rw-r--r--arch/x86/kernel/umip.c1
-rw-r--r--arch/x86/kvm/mmu.c1
-rw-r--r--arch/x86/mm/fault.c1
-rw-r--r--arch/xtensa/kernel/traps.c1
-rw-r--r--arch/xtensa/mm/fault.c1
-rw-r--r--include/linux/ptrace.h1
-rw-r--r--include/linux/tracehook.h1
-rw-r--r--virt/kvm/arm/mmu.c1
68 files changed, 158 insertions, 24 deletions
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c
index 2e02aef5a334..f5f154942aab 100644
--- a/arch/alpha/kernel/osf_sys.c
+++ b/arch/alpha/kernel/osf_sys.c
@@ -881,6 +881,7 @@ SYSCALL_DEFINE5(osf_setsysinfo, unsigned long, op, void __user *, buffer,
881 if (fex & IEEE_TRAP_ENABLE_DZE) si_code = FPE_FLTDIV; 881 if (fex & IEEE_TRAP_ENABLE_DZE) si_code = FPE_FLTDIV;
882 if (fex & IEEE_TRAP_ENABLE_INV) si_code = FPE_FLTINV; 882 if (fex & IEEE_TRAP_ENABLE_INV) si_code = FPE_FLTINV;
883 883
884 clear_siginfo(&info);
884 info.si_signo = SIGFPE; 885 info.si_signo = SIGFPE;
885 info.si_errno = 0; 886 info.si_errno = 0;
886 info.si_code = si_code; 887 info.si_code = si_code;
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c
index 9ebb3bcbc626..cd306e602313 100644
--- a/arch/alpha/kernel/signal.c
+++ b/arch/alpha/kernel/signal.c
@@ -221,6 +221,7 @@ do_sigreturn(struct sigcontext __user *sc)
221 if (ptrace_cancel_bpt (current)) { 221 if (ptrace_cancel_bpt (current)) {
222 siginfo_t info; 222 siginfo_t info;
223 223
224 clear_siginfo(&info);
224 info.si_signo = SIGTRAP; 225 info.si_signo = SIGTRAP;
225 info.si_errno = 0; 226 info.si_errno = 0;
226 info.si_code = TRAP_BRKPT; 227 info.si_code = TRAP_BRKPT;
@@ -255,6 +256,7 @@ do_rt_sigreturn(struct rt_sigframe __user *frame)
255 if (ptrace_cancel_bpt (current)) { 256 if (ptrace_cancel_bpt (current)) {
256 siginfo_t info; 257 siginfo_t info;
257 258
259 clear_siginfo(&info);
258 info.si_signo = SIGTRAP; 260 info.si_signo = SIGTRAP;
259 info.si_errno = 0; 261 info.si_errno = 0;
260 info.si_code = TRAP_BRKPT; 262 info.si_code = TRAP_BRKPT;
diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c
index f43bd05dede2..91636765dd6d 100644
--- a/arch/alpha/kernel/traps.c
+++ b/arch/alpha/kernel/traps.c
@@ -228,6 +228,7 @@ do_entArith(unsigned long summary, unsigned long write_mask,
228 } 228 }
229 die_if_kernel("Arithmetic fault", regs, 0, NULL); 229 die_if_kernel("Arithmetic fault", regs, 0, NULL);
230 230
231 clear_siginfo(&info);
231 info.si_signo = SIGFPE; 232 info.si_signo = SIGFPE;
232 info.si_errno = 0; 233 info.si_errno = 0;
233 info.si_code = si_code; 234 info.si_code = si_code;
@@ -241,6 +242,7 @@ do_entIF(unsigned long type, struct pt_regs *regs)
241 siginfo_t info; 242 siginfo_t info;
242 int signo, code; 243 int signo, code;
243 244
245 clear_siginfo(&info);
244 if ((regs->ps & ~IPL_MAX) == 0) { 246 if ((regs->ps & ~IPL_MAX) == 0) {
245 if (type == 1) { 247 if (type == 1) {
246 const unsigned int *data 248 const unsigned int *data
@@ -430,6 +432,7 @@ do_entDbg(struct pt_regs *regs)
430 432
431 die_if_kernel("Instruction fault", regs, 0, NULL); 433 die_if_kernel("Instruction fault", regs, 0, NULL);
432 434
435 clear_siginfo(&info);
433 info.si_signo = SIGILL; 436 info.si_signo = SIGILL;
434 info.si_errno = 0; 437 info.si_errno = 0;
435 info.si_code = ILL_ILLOPC; 438 info.si_code = ILL_ILLOPC;
@@ -761,6 +764,8 @@ do_entUnaUser(void __user * va, unsigned long opcode,
761 siginfo_t info; 764 siginfo_t info;
762 long error; 765 long error;
763 766
767 clear_siginfo(&info);
768
764 /* Check the UAC bits to decide what the user wants us to do 769 /* Check the UAC bits to decide what the user wants us to do
765 with the unaliged access. */ 770 with the unaliged access. */
766 771
diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c
index cd3c572ee912..7f2202a9f50a 100644
--- a/arch/alpha/mm/fault.c
+++ b/arch/alpha/mm/fault.c
@@ -91,6 +91,8 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
91 siginfo_t info; 91 siginfo_t info;
92 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 92 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
93 93
94 clear_siginfo(&info);
95
94 /* As of EV6, a load into $31/$f31 is a prefetch, and never faults 96 /* As of EV6, a load into $31/$f31 is a prefetch, and never faults
95 (or is suppressed by the PALcode). Support that for older CPUs 97 (or is suppressed by the PALcode). Support that for older CPUs
96 by ignoring such an instruction. */ 98 by ignoring such an instruction. */
diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c
index a0b7bd6d030d..b884bbd6f354 100644
--- a/arch/arc/mm/fault.c
+++ b/arch/arc/mm/fault.c
@@ -70,6 +70,8 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
70 int write = regs->ecr_cause & ECR_C_PROTV_STORE; /* ST/EX */ 70 int write = regs->ecr_cause & ECR_C_PROTV_STORE; /* ST/EX */
71 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 71 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
72 72
73 clear_siginfo(&info);
74
73 /* 75 /*
74 * We fault-in kernel-space virtual memory on-demand. The 76 * We fault-in kernel-space virtual memory on-demand. The
75 * 'reference' page table is init_mm.pgd. 77 * 'reference' page table is init_mm.pgd.
diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c
index 7724b0f661b3..36718a424358 100644
--- a/arch/arm/kernel/ptrace.c
+++ b/arch/arm/kernel/ptrace.c
@@ -205,6 +205,7 @@ void ptrace_break(struct task_struct *tsk, struct pt_regs *regs)
205{ 205{
206 siginfo_t info; 206 siginfo_t info;
207 207
208 clear_siginfo(&info);
208 info.si_signo = SIGTRAP; 209 info.si_signo = SIGTRAP;
209 info.si_errno = 0; 210 info.si_errno = 0;
210 info.si_code = TRAP_BRKPT; 211 info.si_code = TRAP_BRKPT;
diff --git a/arch/arm/kernel/swp_emulate.c b/arch/arm/kernel/swp_emulate.c
index 3bda08bee674..dfcb456afadd 100644
--- a/arch/arm/kernel/swp_emulate.c
+++ b/arch/arm/kernel/swp_emulate.c
@@ -112,6 +112,7 @@ static void set_segfault(struct pt_regs *regs, unsigned long addr)
112{ 112{
113 siginfo_t info; 113 siginfo_t info;
114 114
115 clear_siginfo(&info);
115 down_read(&current->mm->mmap_sem); 116 down_read(&current->mm->mmap_sem);
116 if (find_vma(current->mm, addr) == NULL) 117 if (find_vma(current->mm, addr) == NULL)
117 info.si_code = SEGV_MAPERR; 118 info.si_code = SEGV_MAPERR;
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index 5e3633c24e63..2584f9066da3 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -439,6 +439,7 @@ asmlinkage void do_undefinstr(struct pt_regs *regs)
439 siginfo_t info; 439 siginfo_t info;
440 void __user *pc; 440 void __user *pc;
441 441
442 clear_siginfo(&info);
442 pc = (void __user *)instruction_pointer(regs); 443 pc = (void __user *)instruction_pointer(regs);
443 444
444 if (processor_mode(regs) == SVC_MODE) { 445 if (processor_mode(regs) == SVC_MODE) {
@@ -537,6 +538,7 @@ static int bad_syscall(int n, struct pt_regs *regs)
537{ 538{
538 siginfo_t info; 539 siginfo_t info;
539 540
541 clear_siginfo(&info);
540 if ((current->personality & PER_MASK) != PER_LINUX) { 542 if ((current->personality & PER_MASK) != PER_LINUX) {
541 send_sig(SIGSEGV, current, 1); 543 send_sig(SIGSEGV, current, 1);
542 return regs->ARM_r0; 544 return regs->ARM_r0;
@@ -604,6 +606,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
604{ 606{
605 siginfo_t info; 607 siginfo_t info;
606 608
609 clear_siginfo(&info);
607 if ((no >> 16) != (__ARM_NR_BASE>> 16)) 610 if ((no >> 16) != (__ARM_NR_BASE>> 16))
608 return bad_syscall(no, regs); 611 return bad_syscall(no, regs);
609 612
@@ -740,6 +743,8 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs)
740 unsigned long addr = instruction_pointer(regs); 743 unsigned long addr = instruction_pointer(regs);
741 siginfo_t info; 744 siginfo_t info;
742 745
746 clear_siginfo(&info);
747
743#ifdef CONFIG_DEBUG_USER 748#ifdef CONFIG_DEBUG_USER
744 if (user_debug & UDBG_BADABORT) { 749 if (user_debug & UDBG_BADABORT) {
745 pr_err("[%d] %s: bad data abort: code %d instr 0x%08lx\n", 750 pr_err("[%d] %s: bad data abort: code %d instr 0x%08lx\n",
diff --git a/arch/arm/mm/alignment.c b/arch/arm/mm/alignment.c
index 2c96190e018b..bd2c739d8083 100644
--- a/arch/arm/mm/alignment.c
+++ b/arch/arm/mm/alignment.c
@@ -950,6 +950,7 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
950 if (ai_usermode & UM_SIGNAL) { 950 if (ai_usermode & UM_SIGNAL) {
951 siginfo_t si; 951 siginfo_t si;
952 952
953 clear_siginfo(&si);
953 si.si_signo = SIGBUS; 954 si.si_signo = SIGBUS;
954 si.si_errno = 0; 955 si.si_errno = 0;
955 si.si_code = BUS_ADRALN; 956 si.si_code = BUS_ADRALN;
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
index b75eada23d0a..32034543f49c 100644
--- a/arch/arm/mm/fault.c
+++ b/arch/arm/mm/fault.c
@@ -163,6 +163,8 @@ __do_user_fault(struct task_struct *tsk, unsigned long addr,
163{ 163{
164 struct siginfo si; 164 struct siginfo si;
165 165
166 clear_siginfo(&si);
167
166#ifdef CONFIG_DEBUG_USER 168#ifdef CONFIG_DEBUG_USER
167 if (((user_debug & UDBG_SEGV) && (sig == SIGSEGV)) || 169 if (((user_debug & UDBG_SEGV) && (sig == SIGSEGV)) ||
168 ((user_debug & UDBG_BUS) && (sig == SIGBUS))) { 170 ((user_debug & UDBG_BUS) && (sig == SIGBUS))) {
@@ -557,6 +559,7 @@ do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
557 inf->name, fsr, addr); 559 inf->name, fsr, addr);
558 show_pte(current->mm, addr); 560 show_pte(current->mm, addr);
559 561
562 clear_siginfo(&info);
560 info.si_signo = inf->sig; 563 info.si_signo = inf->sig;
561 info.si_errno = 0; 564 info.si_errno = 0;
562 info.si_code = inf->code; 565 info.si_code = inf->code;
@@ -589,6 +592,7 @@ do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *regs)
589 pr_alert("Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n", 592 pr_alert("Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n",
590 inf->name, ifsr, addr); 593 inf->name, ifsr, addr);
591 594
595 clear_siginfo(&info);
592 info.si_signo = inf->sig; 596 info.si_signo = inf->sig;
593 info.si_errno = 0; 597 info.si_errno = 0;
594 info.si_code = inf->code; 598 info.si_code = inf->code;
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
index 4c375e11ae95..adda3fc2dde8 100644
--- a/arch/arm/vfp/vfpmodule.c
+++ b/arch/arm/vfp/vfpmodule.c
@@ -218,8 +218,7 @@ static void vfp_raise_sigfpe(unsigned int sicode, struct pt_regs *regs)
218{ 218{
219 siginfo_t info; 219 siginfo_t info;
220 220
221 memset(&info, 0, sizeof(info)); 221 clear_siginfo(&info);
222
223 info.si_signo = SIGFPE; 222 info.si_signo = SIGFPE;
224 info.si_code = sicode; 223 info.si_code = sicode;
225 info.si_addr = (void __user *)(instruction_pointer(regs) - 4); 224 info.si_addr = (void __user *)(instruction_pointer(regs) - 4);
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index 87a35364e750..4bcdd0318729 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -882,7 +882,7 @@ asmlinkage void do_fpsimd_exc(unsigned int esr, struct pt_regs *regs)
882 si_code = FPE_FLTRES; 882 si_code = FPE_FLTRES;
883 } 883 }
884 884
885 memset(&info, 0, sizeof(info)); 885 clear_siginfo(&info);
886 info.si_signo = SIGFPE; 886 info.si_signo = SIGFPE;
887 info.si_code = si_code; 887 info.si_code = si_code;
888 info.si_addr = (void __user *)instruction_pointer(regs); 888 info.si_addr = (void __user *)instruction_pointer(regs);
diff --git a/arch/arm64/kernel/sys_compat.c b/arch/arm64/kernel/sys_compat.c
index 93ab57dcfc14..a6109825eeb9 100644
--- a/arch/arm64/kernel/sys_compat.c
+++ b/arch/arm64/kernel/sys_compat.c
@@ -112,6 +112,7 @@ long compat_arm_syscall(struct pt_regs *regs)
112 break; 112 break;
113 } 113 }
114 114
115 clear_siginfo(&info);
115 info.si_signo = SIGILL; 116 info.si_signo = SIGILL;
116 info.si_errno = 0; 117 info.si_errno = 0;
117 info.si_code = ILL_ILLTRP; 118 info.si_code = ILL_ILLTRP;
diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c
index ba964da31a25..7f476586cacc 100644
--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -634,6 +634,7 @@ asmlinkage void bad_el0_sync(struct pt_regs *regs, int reason, unsigned int esr)
634 siginfo_t info; 634 siginfo_t info;
635 void __user *pc = (void __user *)instruction_pointer(regs); 635 void __user *pc = (void __user *)instruction_pointer(regs);
636 636
637 clear_siginfo(&info);
637 info.si_signo = SIGILL; 638 info.si_signo = SIGILL;
638 info.si_errno = 0; 639 info.si_errno = 0;
639 info.si_code = ILL_ILLOPC; 640 info.si_code = ILL_ILLOPC;
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 4165485e8b6e..91c53a7d2575 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -305,11 +305,12 @@ static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *re
305 */ 305 */
306 if (user_mode(regs)) { 306 if (user_mode(regs)) {
307 const struct fault_info *inf = esr_to_fault_info(esr); 307 const struct fault_info *inf = esr_to_fault_info(esr);
308 struct siginfo si = { 308 struct siginfo si;
309 .si_signo = inf->sig, 309
310 .si_code = inf->code, 310 clear_siginfo(&si);
311 .si_addr = (void __user *)addr, 311 si.si_signo = inf->sig;
312 }; 312 si.si_code = inf->code;
313 si.si_addr = (void __user *)addr;
313 314
314 __do_user_fault(&si, esr); 315 __do_user_fault(&si, esr);
315 } else { 316 } else {
@@ -583,6 +584,7 @@ static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs)
583 nmi_exit(); 584 nmi_exit();
584 } 585 }
585 586
587 clear_siginfo(&info);
586 info.si_signo = inf->sig; 588 info.si_signo = inf->sig;
587 info.si_errno = 0; 589 info.si_errno = 0;
588 info.si_code = inf->code; 590 info.si_code = inf->code;
@@ -687,6 +689,7 @@ asmlinkage void __exception do_mem_abort(unsigned long addr, unsigned int esr,
687 show_pte(addr); 689 show_pte(addr);
688 } 690 }
689 691
692 clear_siginfo(&info);
690 info.si_signo = inf->sig; 693 info.si_signo = inf->sig;
691 info.si_errno = 0; 694 info.si_errno = 0;
692 info.si_code = inf->code; 695 info.si_code = inf->code;
@@ -729,6 +732,7 @@ asmlinkage void __exception do_sp_pc_abort(unsigned long addr,
729 local_irq_enable(); 732 local_irq_enable();
730 } 733 }
731 734
735 clear_siginfo(&info);
732 info.si_signo = SIGBUS; 736 info.si_signo = SIGBUS;
733 info.si_errno = 0; 737 info.si_errno = 0;
734 info.si_code = BUS_ADRALN; 738 info.si_code = BUS_ADRALN;
@@ -772,7 +776,6 @@ asmlinkage int __exception do_debug_exception(unsigned long addr,
772 struct pt_regs *regs) 776 struct pt_regs *regs)
773{ 777{
774 const struct fault_info *inf = debug_fault_info + DBG_ESR_EVT(esr); 778 const struct fault_info *inf = debug_fault_info + DBG_ESR_EVT(esr);
775 struct siginfo info;
776 int rv; 779 int rv;
777 780
778 /* 781 /*
@@ -788,6 +791,9 @@ asmlinkage int __exception do_debug_exception(unsigned long addr,
788 if (!inf->fn(addr, esr, regs)) { 791 if (!inf->fn(addr, esr, regs)) {
789 rv = 1; 792 rv = 1;
790 } else { 793 } else {
794 struct siginfo info;
795
796 clear_siginfo(&info);
791 info.si_signo = inf->sig; 797 info.si_signo = inf->sig;
792 info.si_errno = 0; 798 info.si_errno = 0;
793 info.si_code = inf->code; 799 info.si_code = inf->code;
diff --git a/arch/c6x/kernel/traps.c b/arch/c6x/kernel/traps.c
index 4c1d4b84dd2b..c5feee4542b0 100644
--- a/arch/c6x/kernel/traps.c
+++ b/arch/c6x/kernel/traps.c
@@ -246,6 +246,7 @@ static void do_trap(struct exception_info *except_info, struct pt_regs *regs)
246 unsigned long addr = instruction_pointer(regs); 246 unsigned long addr = instruction_pointer(regs);
247 siginfo_t info; 247 siginfo_t info;
248 248
249 clear_siginfo(&info);
249 if (except_info->code != TRAP_BRKPT) 250 if (except_info->code != TRAP_BRKPT)
250 pr_err("TRAP: %s PC[0x%lx] signo[%d] code[%d]\n", 251 pr_err("TRAP: %s PC[0x%lx] signo[%d] code[%d]\n",
251 except_info->kernel_str, regs->pc, 252 except_info->kernel_str, regs->pc,
diff --git a/arch/hexagon/kernel/traps.c b/arch/hexagon/kernel/traps.c
index 2942a9204a9a..1ff6a6a7b97c 100644
--- a/arch/hexagon/kernel/traps.c
+++ b/arch/hexagon/kernel/traps.c
@@ -414,6 +414,7 @@ void do_trap0(struct pt_regs *regs)
414 if (user_mode(regs)) { 414 if (user_mode(regs)) {
415 struct siginfo info; 415 struct siginfo info;
416 416
417 clear_siginfo(&info);
417 info.si_signo = SIGTRAP; 418 info.si_signo = SIGTRAP;
418 info.si_errno = 0; 419 info.si_errno = 0;
419 /* 420 /*
diff --git a/arch/hexagon/mm/vm_fault.c b/arch/hexagon/mm/vm_fault.c
index 3eec33c5cfd7..2ad92edc877c 100644
--- a/arch/hexagon/mm/vm_fault.c
+++ b/arch/hexagon/mm/vm_fault.c
@@ -56,6 +56,7 @@ void do_page_fault(unsigned long address, long cause, struct pt_regs *regs)
56 const struct exception_table_entry *fixup; 56 const struct exception_table_entry *fixup;
57 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 57 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
58 58
59 clear_siginfo(&info);
59 /* 60 /*
60 * If we're in an interrupt or have no user context, 61 * If we're in an interrupt or have no user context,
61 * then must not take the fault. 62 * then must not take the fault.
diff --git a/arch/ia64/kernel/brl_emu.c b/arch/ia64/kernel/brl_emu.c
index 9bcc908bc85e..a61f6c6a36f8 100644
--- a/arch/ia64/kernel/brl_emu.c
+++ b/arch/ia64/kernel/brl_emu.c
@@ -62,6 +62,7 @@ ia64_emulate_brl (struct pt_regs *regs, unsigned long ar_ec)
62 struct illegal_op_return rv; 62 struct illegal_op_return rv;
63 long tmp_taken, unimplemented_address; 63 long tmp_taken, unimplemented_address;
64 64
65 clear_siginfo(&siginfo);
65 rv.fkt = (unsigned long) -1; 66 rv.fkt = (unsigned long) -1;
66 67
67 /* 68 /*
diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c
index 54547c7cf8a2..d1234a5ba4c5 100644
--- a/arch/ia64/kernel/signal.c
+++ b/arch/ia64/kernel/signal.c
@@ -153,6 +153,7 @@ ia64_rt_sigreturn (struct sigscratch *scr)
153 return retval; 153 return retval;
154 154
155 give_sigsegv: 155 give_sigsegv:
156 clear_siginfo(&si);
156 si.si_signo = SIGSEGV; 157 si.si_signo = SIGSEGV;
157 si.si_errno = 0; 158 si.si_errno = 0;
158 si.si_code = SI_KERNEL; 159 si.si_code = SI_KERNEL;
@@ -236,6 +237,7 @@ force_sigsegv_info (int sig, void __user *addr)
236 unsigned long flags; 237 unsigned long flags;
237 struct siginfo si; 238 struct siginfo si;
238 239
240 clear_siginfo(&si);
239 if (sig == SIGSEGV) { 241 if (sig == SIGSEGV) {
240 /* 242 /*
241 * Acquiring siglock around the sa_handler-update is almost 243 * Acquiring siglock around the sa_handler-update is almost
diff --git a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c
index 6d4e76a4267f..972873ed1ae5 100644
--- a/arch/ia64/kernel/traps.c
+++ b/arch/ia64/kernel/traps.c
@@ -104,6 +104,7 @@ __kprobes ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
104 int sig, code; 104 int sig, code;
105 105
106 /* SIGILL, SIGFPE, SIGSEGV, and SIGBUS want these field initialized: */ 106 /* SIGILL, SIGFPE, SIGSEGV, and SIGBUS want these field initialized: */
107 clear_siginfo(&siginfo);
107 siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri); 108 siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri);
108 siginfo.si_imm = break_num; 109 siginfo.si_imm = break_num;
109 siginfo.si_flags = 0; /* clear __ISR_VALID */ 110 siginfo.si_flags = 0; /* clear __ISR_VALID */
@@ -293,7 +294,6 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr)
293{ 294{
294 long exception, bundle[2]; 295 long exception, bundle[2];
295 unsigned long fault_ip; 296 unsigned long fault_ip;
296 struct siginfo siginfo;
297 297
298 fault_ip = regs->cr_iip; 298 fault_ip = regs->cr_iip;
299 if (!fp_fault && (ia64_psr(regs)->ri == 0)) 299 if (!fp_fault && (ia64_psr(regs)->ri == 0))
@@ -344,10 +344,13 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr)
344 printk(KERN_ERR "handle_fpu_swa: fp_emulate() returned -1\n"); 344 printk(KERN_ERR "handle_fpu_swa: fp_emulate() returned -1\n");
345 return -1; 345 return -1;
346 } else { 346 } else {
347 struct siginfo siginfo;
348
347 /* is next instruction a trap? */ 349 /* is next instruction a trap? */
348 if (exception & 2) { 350 if (exception & 2) {
349 ia64_increment_ip(regs); 351 ia64_increment_ip(regs);
350 } 352 }
353 clear_siginfo(&siginfo);
351 siginfo.si_signo = SIGFPE; 354 siginfo.si_signo = SIGFPE;
352 siginfo.si_errno = 0; 355 siginfo.si_errno = 0;
353 siginfo.si_code = FPE_FIXME; /* default code */ 356 siginfo.si_code = FPE_FIXME; /* default code */
@@ -372,6 +375,9 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr)
372 return -1; 375 return -1;
373 } else if (exception != 0) { 376 } else if (exception != 0) {
374 /* raise exception */ 377 /* raise exception */
378 struct siginfo siginfo;
379
380 clear_siginfo(&siginfo);
375 siginfo.si_signo = SIGFPE; 381 siginfo.si_signo = SIGFPE;
376 siginfo.si_errno = 0; 382 siginfo.si_errno = 0;
377 siginfo.si_code = FPE_FIXME; /* default code */ 383 siginfo.si_code = FPE_FIXME; /* default code */
@@ -420,7 +426,7 @@ ia64_illegal_op_fault (unsigned long ec, long arg1, long arg2, long arg3,
420 if (die_if_kernel(buf, &regs, 0)) 426 if (die_if_kernel(buf, &regs, 0))
421 return rv; 427 return rv;
422 428
423 memset(&si, 0, sizeof(si)); 429 clear_siginfo(&si);
424 si.si_signo = SIGILL; 430 si.si_signo = SIGILL;
425 si.si_code = ILL_ILLOPC; 431 si.si_code = ILL_ILLOPC;
426 si.si_addr = (void __user *) (regs.cr_iip + ia64_psr(&regs)->ri); 432 si.si_addr = (void __user *) (regs.cr_iip + ia64_psr(&regs)->ri);
@@ -434,7 +440,6 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
434 long arg7, struct pt_regs regs) 440 long arg7, struct pt_regs regs)
435{ 441{
436 unsigned long code, error = isr, iip; 442 unsigned long code, error = isr, iip;
437 struct siginfo siginfo;
438 char buf[128]; 443 char buf[128];
439 int result, sig; 444 int result, sig;
440 static const char *reason[] = { 445 static const char *reason[] = {
@@ -485,6 +490,7 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
485 490
486 case 26: /* NaT Consumption */ 491 case 26: /* NaT Consumption */
487 if (user_mode(&regs)) { 492 if (user_mode(&regs)) {
493 struct siginfo siginfo;
488 void __user *addr; 494 void __user *addr;
489 495
490 if (((isr >> 4) & 0xf) == 2) { 496 if (((isr >> 4) & 0xf) == 2) {
@@ -499,6 +505,7 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
499 addr = (void __user *) (regs.cr_iip 505 addr = (void __user *) (regs.cr_iip
500 + ia64_psr(&regs)->ri); 506 + ia64_psr(&regs)->ri);
501 } 507 }
508 clear_siginfo(&siginfo);
502 siginfo.si_signo = sig; 509 siginfo.si_signo = sig;
503 siginfo.si_code = code; 510 siginfo.si_code = code;
504 siginfo.si_errno = 0; 511 siginfo.si_errno = 0;
@@ -515,6 +522,9 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
515 522
516 case 31: /* Unsupported Data Reference */ 523 case 31: /* Unsupported Data Reference */
517 if (user_mode(&regs)) { 524 if (user_mode(&regs)) {
525 struct siginfo siginfo;
526
527 clear_siginfo(&siginfo);
518 siginfo.si_signo = SIGILL; 528 siginfo.si_signo = SIGILL;
519 siginfo.si_code = ILL_ILLOPN; 529 siginfo.si_code = ILL_ILLOPN;
520 siginfo.si_errno = 0; 530 siginfo.si_errno = 0;
@@ -531,6 +541,10 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
531 case 29: /* Debug */ 541 case 29: /* Debug */
532 case 35: /* Taken Branch Trap */ 542 case 35: /* Taken Branch Trap */
533 case 36: /* Single Step Trap */ 543 case 36: /* Single Step Trap */
544 {
545 struct siginfo siginfo;
546
547 clear_siginfo(&siginfo);
534 if (fsys_mode(current, &regs)) { 548 if (fsys_mode(current, &regs)) {
535 extern char __kernel_syscall_via_break[]; 549 extern char __kernel_syscall_via_break[];
536 /* 550 /*
@@ -578,11 +592,15 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
578 siginfo.si_isr = isr; 592 siginfo.si_isr = isr;
579 force_sig_info(SIGTRAP, &siginfo, current); 593 force_sig_info(SIGTRAP, &siginfo, current);
580 return; 594 return;
595 }
581 596
582 case 32: /* fp fault */ 597 case 32: /* fp fault */
583 case 33: /* fp trap */ 598 case 33: /* fp trap */
584 result = handle_fpu_swa((vector == 32) ? 1 : 0, &regs, isr); 599 result = handle_fpu_swa((vector == 32) ? 1 : 0, &regs, isr);
585 if ((result < 0) || (current->thread.flags & IA64_THREAD_FPEMU_SIGFPE)) { 600 if ((result < 0) || (current->thread.flags & IA64_THREAD_FPEMU_SIGFPE)) {
601 struct siginfo siginfo;
602
603 clear_siginfo(&siginfo);
586 siginfo.si_signo = SIGFPE; 604 siginfo.si_signo = SIGFPE;
587 siginfo.si_errno = 0; 605 siginfo.si_errno = 0;
588 siginfo.si_code = FPE_FLTINV; 606 siginfo.si_code = FPE_FLTINV;
@@ -616,6 +634,9 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
616 } else { 634 } else {
617 /* Unimplemented Instr. Address Trap */ 635 /* Unimplemented Instr. Address Trap */
618 if (user_mode(&regs)) { 636 if (user_mode(&regs)) {
637 struct siginfo siginfo;
638
639 clear_siginfo(&siginfo);
619 siginfo.si_signo = SIGILL; 640 siginfo.si_signo = SIGILL;
620 siginfo.si_code = ILL_BADIADDR; 641 siginfo.si_code = ILL_BADIADDR;
621 siginfo.si_errno = 0; 642 siginfo.si_errno = 0;
diff --git a/arch/ia64/kernel/unaligned.c b/arch/ia64/kernel/unaligned.c
index 72e9b4242564..e309f9859acc 100644
--- a/arch/ia64/kernel/unaligned.c
+++ b/arch/ia64/kernel/unaligned.c
@@ -1537,6 +1537,7 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs)
1537 /* NOT_REACHED */ 1537 /* NOT_REACHED */
1538 } 1538 }
1539 force_sigbus: 1539 force_sigbus:
1540 clear_siginfo(&si);
1540 si.si_signo = SIGBUS; 1541 si.si_signo = SIGBUS;
1541 si.si_errno = 0; 1542 si.si_errno = 0;
1542 si.si_code = BUS_ADRALN; 1543 si.si_code = BUS_ADRALN;
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c
index dfdc152d6737..817fa120645f 100644
--- a/arch/ia64/mm/fault.c
+++ b/arch/ia64/mm/fault.c
@@ -85,7 +85,6 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
85 int signal = SIGSEGV, code = SEGV_MAPERR; 85 int signal = SIGSEGV, code = SEGV_MAPERR;
86 struct vm_area_struct *vma, *prev_vma; 86 struct vm_area_struct *vma, *prev_vma;
87 struct mm_struct *mm = current->mm; 87 struct mm_struct *mm = current->mm;
88 struct siginfo si;
89 unsigned long mask; 88 unsigned long mask;
90 int fault; 89 int fault;
91 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 90 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
@@ -249,6 +248,9 @@ retry:
249 return; 248 return;
250 } 249 }
251 if (user_mode(regs)) { 250 if (user_mode(regs)) {
251 struct siginfo si;
252
253 clear_siginfo(&si);
252 si.si_signo = signal; 254 si.si_signo = signal;
253 si.si_errno = 0; 255 si.si_errno = 0;
254 si.si_code = code; 256 si.si_code = code;
diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c
index c1cc4e99aa94..0a00b476236d 100644
--- a/arch/m68k/kernel/traps.c
+++ b/arch/m68k/kernel/traps.c
@@ -1011,6 +1011,7 @@ asmlinkage void trap_c(struct frame *fp)
1011 int vector = (fp->ptregs.vector >> 2) & 0xff; 1011 int vector = (fp->ptregs.vector >> 2) & 0xff;
1012 siginfo_t info; 1012 siginfo_t info;
1013 1013
1014 clear_siginfo(&info);
1014 if (fp->ptregs.sr & PS_S) { 1015 if (fp->ptregs.sr & PS_S) {
1015 if (vector == VEC_TRACE) { 1016 if (vector == VEC_TRACE) {
1016 /* traced a trapping instruction on a 68020/30, 1017 /* traced a trapping instruction on a 68020/30,
@@ -1163,6 +1164,7 @@ asmlinkage void fpemu_signal(int signal, int code, void *addr)
1163{ 1164{
1164 siginfo_t info; 1165 siginfo_t info;
1165 1166
1167 clear_siginfo(&info);
1166 info.si_signo = signal; 1168 info.si_signo = signal;
1167 info.si_errno = 0; 1169 info.si_errno = 0;
1168 info.si_code = code; 1170 info.si_code = code;
diff --git a/arch/microblaze/kernel/exceptions.c b/arch/microblaze/kernel/exceptions.c
index e6f338d0496b..443ec1feacb4 100644
--- a/arch/microblaze/kernel/exceptions.c
+++ b/arch/microblaze/kernel/exceptions.c
@@ -65,6 +65,7 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
65 if (kernel_mode(regs)) 65 if (kernel_mode(regs))
66 die("Exception in kernel mode", regs, signr); 66 die("Exception in kernel mode", regs, signr);
67 67
68 clear_siginfo(&info);
68 info.si_signo = signr; 69 info.si_signo = signr;
69 info.si_errno = 0; 70 info.si_errno = 0;
70 info.si_code = code; 71 info.si_code = code;
diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c
index f91b30f8aaa8..43d92167012a 100644
--- a/arch/microblaze/mm/fault.c
+++ b/arch/microblaze/mm/fault.c
@@ -88,7 +88,6 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
88{ 88{
89 struct vm_area_struct *vma; 89 struct vm_area_struct *vma;
90 struct mm_struct *mm = current->mm; 90 struct mm_struct *mm = current->mm;
91 siginfo_t info;
92 int code = SEGV_MAPERR; 91 int code = SEGV_MAPERR;
93 int is_write = error_code & ESR_S; 92 int is_write = error_code & ESR_S;
94 int fault; 93 int fault;
@@ -295,6 +294,9 @@ out_of_memory:
295do_sigbus: 294do_sigbus:
296 up_read(&mm->mmap_sem); 295 up_read(&mm->mmap_sem);
297 if (user_mode(regs)) { 296 if (user_mode(regs)) {
297 siginfo_t info;
298
299 clear_siginfo(&info);
298 info.si_signo = SIGBUS; 300 info.si_signo = SIGBUS;
299 info.si_errno = 0; 301 info.si_errno = 0;
300 info.si_code = BUS_ADRERR; 302 info.si_code = BUS_ADRERR;
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c
index 4f8f5bf46977..75392becd933 100644
--- a/arch/mips/mm/fault.c
+++ b/arch/mips/mm/fault.c
@@ -63,6 +63,7 @@ static void __kprobes __do_page_fault(struct pt_regs *regs, unsigned long write,
63 return; 63 return;
64#endif 64#endif
65 65
66 clear_siginfo(&info);
66 info.si_code = SEGV_MAPERR; 67 info.si_code = SEGV_MAPERR;
67 68
68 /* 69 /*
diff --git a/arch/nds32/kernel/traps.c b/arch/nds32/kernel/traps.c
index 8e9a5b1f6234..46911768f4b5 100644
--- a/arch/nds32/kernel/traps.c
+++ b/arch/nds32/kernel/traps.c
@@ -229,6 +229,7 @@ int bad_syscall(int n, struct pt_regs *regs)
229 return regs->uregs[0]; 229 return regs->uregs[0];
230 } 230 }
231 231
232 clear_siginfo(&info);
232 info.si_signo = SIGILL; 233 info.si_signo = SIGILL;
233 info.si_errno = 0; 234 info.si_errno = 0;
234 info.si_code = ILL_ILLTRP; 235 info.si_code = ILL_ILLTRP;
@@ -292,7 +293,7 @@ void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
292 tsk->thread.trap_no = ENTRY_DEBUG_RELATED; 293 tsk->thread.trap_no = ENTRY_DEBUG_RELATED;
293 tsk->thread.error_code = error_code; 294 tsk->thread.error_code = error_code;
294 295
295 memset(&info, 0, sizeof(info)); 296 clear_siginfo(&info);
296 info.si_signo = SIGTRAP; 297 info.si_signo = SIGTRAP;
297 info.si_code = si_code; 298 info.si_code = si_code;
298 info.si_addr = (void __user *)instruction_pointer(regs); 299 info.si_addr = (void __user *)instruction_pointer(regs);
diff --git a/arch/nds32/mm/fault.c b/arch/nds32/mm/fault.c
index 3a246fb8098c..876ee01ff80a 100644
--- a/arch/nds32/mm/fault.c
+++ b/arch/nds32/mm/fault.c
@@ -77,6 +77,7 @@ void do_page_fault(unsigned long entry, unsigned long addr,
77 unsigned int mask = VM_READ | VM_WRITE | VM_EXEC; 77 unsigned int mask = VM_READ | VM_WRITE | VM_EXEC;
78 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 78 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
79 79
80 clear_siginfo(&info);
80 error_code = error_code & (ITYPE_mskINST | ITYPE_mskETYPE); 81 error_code = error_code & (ITYPE_mskINST | ITYPE_mskETYPE);
81 tsk = current; 82 tsk = current;
82 mm = tsk->mm; 83 mm = tsk->mm;
diff --git a/arch/nios2/kernel/traps.c b/arch/nios2/kernel/traps.c
index 8184e7d6b385..a69861d3e1a3 100644
--- a/arch/nios2/kernel/traps.c
+++ b/arch/nios2/kernel/traps.c
@@ -28,6 +28,7 @@ static void _send_sig(int signo, int code, unsigned long addr)
28{ 28{
29 siginfo_t info; 29 siginfo_t info;
30 30
31 clear_siginfo(&info);
31 info.si_signo = signo; 32 info.si_signo = signo;
32 info.si_errno = 0; 33 info.si_errno = 0;
33 info.si_code = code; 34 info.si_code = code;
diff --git a/arch/openrisc/kernel/traps.c b/arch/openrisc/kernel/traps.c
index 113c175fe469..1610b1d65a11 100644
--- a/arch/openrisc/kernel/traps.c
+++ b/arch/openrisc/kernel/traps.c
@@ -251,7 +251,7 @@ void __init trap_init(void)
251asmlinkage void do_trap(struct pt_regs *regs, unsigned long address) 251asmlinkage void do_trap(struct pt_regs *regs, unsigned long address)
252{ 252{
253 siginfo_t info; 253 siginfo_t info;
254 memset(&info, 0, sizeof(info)); 254 clear_siginfo(&info);
255 info.si_signo = SIGTRAP; 255 info.si_signo = SIGTRAP;
256 info.si_code = TRAP_TRACE; 256 info.si_code = TRAP_TRACE;
257 info.si_addr = (void *)address; 257 info.si_addr = (void *)address;
@@ -266,6 +266,7 @@ asmlinkage void do_unaligned_access(struct pt_regs *regs, unsigned long address)
266 266
267 if (user_mode(regs)) { 267 if (user_mode(regs)) {
268 /* Send a SIGBUS */ 268 /* Send a SIGBUS */
269 clear_siginfo(&info);
269 info.si_signo = SIGBUS; 270 info.si_signo = SIGBUS;
270 info.si_errno = 0; 271 info.si_errno = 0;
271 info.si_code = BUS_ADRALN; 272 info.si_code = BUS_ADRALN;
@@ -285,6 +286,7 @@ asmlinkage void do_bus_fault(struct pt_regs *regs, unsigned long address)
285 286
286 if (user_mode(regs)) { 287 if (user_mode(regs)) {
287 /* Send a SIGBUS */ 288 /* Send a SIGBUS */
289 clear_siginfo(&info);
288 info.si_signo = SIGBUS; 290 info.si_signo = SIGBUS;
289 info.si_errno = 0; 291 info.si_errno = 0;
290 info.si_code = BUS_ADRERR; 292 info.si_code = BUS_ADRERR;
@@ -485,6 +487,7 @@ asmlinkage void do_illegal_instruction(struct pt_regs *regs,
485 487
486 if (user_mode(regs)) { 488 if (user_mode(regs)) {
487 /* Send a SIGILL */ 489 /* Send a SIGILL */
490 clear_siginfo(&info);
488 info.si_signo = SIGILL; 491 info.si_signo = SIGILL;
489 info.si_errno = 0; 492 info.si_errno = 0;
490 info.si_code = ILL_ILLOPC; 493 info.si_code = ILL_ILLOPC;
diff --git a/arch/openrisc/mm/fault.c b/arch/openrisc/mm/fault.c
index d0021dfae20a..68be33e4ae17 100644
--- a/arch/openrisc/mm/fault.c
+++ b/arch/openrisc/mm/fault.c
@@ -56,6 +56,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long address,
56 int fault; 56 int fault;
57 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 57 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
58 58
59 clear_siginfo(&info);
59 tsk = current; 60 tsk = current;
60 61
61 /* 62 /*
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c
index 1a2be6e639b5..b1c12ceb1c88 100644
--- a/arch/parisc/kernel/ptrace.c
+++ b/arch/parisc/kernel/ptrace.c
@@ -90,6 +90,7 @@ void user_enable_single_step(struct task_struct *task)
90 ptrace_disable(task); 90 ptrace_disable(task);
91 /* Don't wake up the task, but let the 91 /* Don't wake up the task, but let the
92 parent know something happened. */ 92 parent know something happened. */
93 clear_siginfo(&si);
93 si.si_code = TRAP_TRACE; 94 si.si_code = TRAP_TRACE;
94 si.si_addr = (void __user *) (task_regs(task)->iaoq[0] & ~3); 95 si.si_addr = (void __user *) (task_regs(task)->iaoq[0] & ~3);
95 si.si_signo = SIGTRAP; 96 si.si_signo = SIGTRAP;
diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c
index 68e671a11987..98f9f2f85940 100644
--- a/arch/parisc/kernel/traps.c
+++ b/arch/parisc/kernel/traps.c
@@ -299,6 +299,7 @@ static void handle_gdb_break(struct pt_regs *regs, int wot)
299{ 299{
300 struct siginfo si; 300 struct siginfo si;
301 301
302 clear_siginfo(&si);
302 si.si_signo = SIGTRAP; 303 si.si_signo = SIGTRAP;
303 si.si_errno = 0; 304 si.si_errno = 0;
304 si.si_code = wot; 305 si.si_code = wot;
@@ -489,6 +490,7 @@ void notrace handle_interruption(int code, struct pt_regs *regs)
489 unsigned long fault_space = 0; 490 unsigned long fault_space = 0;
490 struct siginfo si; 491 struct siginfo si;
491 492
493 clear_siginfo(&si);
492 if (code == 1) 494 if (code == 1)
493 pdc_console_restart(); /* switch back to pdc if HPMC */ 495 pdc_console_restart(); /* switch back to pdc if HPMC */
494 else 496 else
diff --git a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c
index e36f7b75ab07..30b7c7f6c471 100644
--- a/arch/parisc/kernel/unaligned.c
+++ b/arch/parisc/kernel/unaligned.c
@@ -455,6 +455,7 @@ void handle_unaligned(struct pt_regs *regs)
455 struct siginfo si; 455 struct siginfo si;
456 register int flop=0; /* true if this is a flop */ 456 register int flop=0; /* true if this is a flop */
457 457
458 clear_siginfo(&si);
458 __inc_irq_stat(irq_unaligned_count); 459 __inc_irq_stat(irq_unaligned_count);
459 460
460 /* log a message with pacing */ 461 /* log a message with pacing */
diff --git a/arch/parisc/math-emu/driver.c b/arch/parisc/math-emu/driver.c
index 2fb59d2e2b29..0d10efb53361 100644
--- a/arch/parisc/math-emu/driver.c
+++ b/arch/parisc/math-emu/driver.c
@@ -93,6 +93,7 @@ handle_fpe(struct pt_regs *regs)
93 */ 93 */
94 __u64 frcopy[36]; 94 __u64 frcopy[36];
95 95
96 clear_siginfo(&si);
96 memcpy(frcopy, regs->fr, sizeof regs->fr); 97 memcpy(frcopy, regs->fr, sizeof regs->fr);
97 frcopy[32] = 0; 98 frcopy[32] = 0;
98 99
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c
index e247edbca68e..657b35096bd8 100644
--- a/arch/parisc/mm/fault.c
+++ b/arch/parisc/mm/fault.c
@@ -356,6 +356,7 @@ bad_area:
356 struct siginfo si; 356 struct siginfo si;
357 unsigned int lsb = 0; 357 unsigned int lsb = 0;
358 358
359 clear_siginfo(&si);
359 switch (code) { 360 switch (code) {
360 case 15: /* Data TLB miss fault/Data page fault */ 361 case 15: /* Data TLB miss fault/Data page fault */
361 /* send SIGSEGV when outside of vma */ 362 /* send SIGSEGV when outside of vma */
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 1237f13fed51..26ea9793d290 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -632,6 +632,7 @@ void do_break (struct pt_regs *regs, unsigned long address,
632 hw_breakpoint_disable(); 632 hw_breakpoint_disable();
633 633
634 /* Deliver the signal to userspace */ 634 /* Deliver the signal to userspace */
635 clear_siginfo(&info);
635 info.si_signo = SIGTRAP; 636 info.si_signo = SIGTRAP;
636 info.si_errno = 0; 637 info.si_errno = 0;
637 info.si_code = TRAP_HWBKPT; 638 info.si_code = TRAP_HWBKPT;
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index 0904492e7032..087855caf6a9 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -296,7 +296,6 @@ NOKPROBE_SYMBOL(die);
296void user_single_step_siginfo(struct task_struct *tsk, 296void user_single_step_siginfo(struct task_struct *tsk,
297 struct pt_regs *regs, siginfo_t *info) 297 struct pt_regs *regs, siginfo_t *info)
298{ 298{
299 memset(info, 0, sizeof(*info));
300 info->si_signo = SIGTRAP; 299 info->si_signo = SIGTRAP;
301 info->si_code = TRAP_TRACE; 300 info->si_code = TRAP_TRACE;
302 info->si_addr = (void __user *)regs->nip; 301 info->si_addr = (void __user *)regs->nip;
@@ -334,7 +333,7 @@ void _exception_pkey(int signr, struct pt_regs *regs, int code,
334 */ 333 */
335 thread_pkey_regs_save(&current->thread); 334 thread_pkey_regs_save(&current->thread);
336 335
337 memset(&info, 0, sizeof(info)); 336 clear_siginfo(&info);
338 info.si_signo = signr; 337 info.si_signo = signr;
339 info.si_code = code; 338 info.si_code = code;
340 info.si_addr = (void __user *) addr; 339 info.si_addr = (void __user *) addr;
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
index c01d627e687a..ef268d5d9db7 100644
--- a/arch/powerpc/mm/fault.c
+++ b/arch/powerpc/mm/fault.c
@@ -168,6 +168,7 @@ static int do_sigbus(struct pt_regs *regs, unsigned long address,
168 return SIGBUS; 168 return SIGBUS;
169 169
170 current->thread.trap_nr = BUS_ADRERR; 170 current->thread.trap_nr = BUS_ADRERR;
171 clear_siginfo(&info);
171 info.si_signo = SIGBUS; 172 info.si_signo = SIGBUS;
172 info.si_errno = 0; 173 info.si_errno = 0;
173 info.si_code = BUS_ADRERR; 174 info.si_code = BUS_ADRERR;
diff --git a/arch/powerpc/platforms/cell/spufs/fault.c b/arch/powerpc/platforms/cell/spufs/fault.c
index 870c0a82d560..1e002e94d0f6 100644
--- a/arch/powerpc/platforms/cell/spufs/fault.c
+++ b/arch/powerpc/platforms/cell/spufs/fault.c
@@ -44,7 +44,7 @@ static void spufs_handle_event(struct spu_context *ctx,
44 return; 44 return;
45 } 45 }
46 46
47 memset(&info, 0, sizeof(info)); 47 clear_siginfo(&info);
48 48
49 switch (type) { 49 switch (type) {
50 case SPE_EVENT_INVALID_DMA: 50 case SPE_EVENT_INVALID_DMA:
diff --git a/arch/riscv/kernel/traps.c b/arch/riscv/kernel/traps.c
index 93132cb59184..48aa6471cede 100644
--- a/arch/riscv/kernel/traps.c
+++ b/arch/riscv/kernel/traps.c
@@ -68,6 +68,7 @@ static inline void do_trap_siginfo(int signo, int code,
68{ 68{
69 siginfo_t info; 69 siginfo_t info;
70 70
71 clear_siginfo(&info);
71 info.si_signo = signo; 72 info.si_signo = signo;
72 info.si_errno = 0; 73 info.si_errno = 0;
73 info.si_code = code; 74 info.si_code = code;
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c
index a5297a22bc1e..3ba649d8aa5a 100644
--- a/arch/s390/kernel/traps.c
+++ b/arch/s390/kernel/traps.c
@@ -47,6 +47,7 @@ void do_report_trap(struct pt_regs *regs, int si_signo, int si_code, char *str)
47 siginfo_t info; 47 siginfo_t info;
48 48
49 if (user_mode(regs)) { 49 if (user_mode(regs)) {
50 clear_siginfo(&info);
50 info.si_signo = si_signo; 51 info.si_signo = si_signo;
51 info.si_errno = 0; 52 info.si_errno = 0;
52 info.si_code = si_code; 53 info.si_code = si_code;
@@ -86,6 +87,7 @@ void do_per_trap(struct pt_regs *regs)
86 return; 87 return;
87 if (!current->ptrace) 88 if (!current->ptrace)
88 return; 89 return;
90 clear_siginfo(&info);
89 info.si_signo = SIGTRAP; 91 info.si_signo = SIGTRAP;
90 info.si_errno = 0; 92 info.si_errno = 0;
91 info.si_code = TRAP_HWBKPT; 93 info.si_code = TRAP_HWBKPT;
@@ -165,7 +167,6 @@ void translation_exception(struct pt_regs *regs)
165 167
166void illegal_op(struct pt_regs *regs) 168void illegal_op(struct pt_regs *regs)
167{ 169{
168 siginfo_t info;
169 __u8 opcode[6]; 170 __u8 opcode[6];
170 __u16 __user *location; 171 __u16 __user *location;
171 int is_uprobe_insn = 0; 172 int is_uprobe_insn = 0;
@@ -178,6 +179,8 @@ void illegal_op(struct pt_regs *regs)
178 return; 179 return;
179 if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) { 180 if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) {
180 if (current->ptrace) { 181 if (current->ptrace) {
182 siginfo_t info;
183 clear_siginfo(&info);
181 info.si_signo = SIGTRAP; 184 info.si_signo = SIGTRAP;
182 info.si_errno = 0; 185 info.si_errno = 0;
183 info.si_code = TRAP_BRKPT; 186 info.si_code = TRAP_BRKPT;
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
index 93faeca52284..b3ff0e8e5860 100644
--- a/arch/s390/mm/fault.c
+++ b/arch/s390/mm/fault.c
@@ -268,6 +268,7 @@ static noinline void do_sigsegv(struct pt_regs *regs, int si_code)
268 struct siginfo si; 268 struct siginfo si;
269 269
270 report_user_fault(regs, SIGSEGV, 1); 270 report_user_fault(regs, SIGSEGV, 1);
271 clear_siginfo(&si);
271 si.si_signo = SIGSEGV; 272 si.si_signo = SIGSEGV;
272 si.si_errno = 0; 273 si.si_errno = 0;
273 si.si_code = si_code; 274 si.si_code = si_code;
@@ -323,6 +324,7 @@ static noinline void do_sigbus(struct pt_regs *regs)
323 * Send a sigbus, regardless of whether we were in kernel 324 * Send a sigbus, regardless of whether we were in kernel
324 * or user mode. 325 * or user mode.
325 */ 326 */
327 clear_siginfo(&si);
326 si.si_signo = SIGBUS; 328 si.si_signo = SIGBUS;
327 si.si_errno = 0; 329 si.si_errno = 0;
328 si.si_code = BUS_ADRERR; 330 si.si_code = BUS_ADRERR;
diff --git a/arch/sh/kernel/traps_32.c b/arch/sh/kernel/traps_32.c
index b3770bb26211..e85e59c3d6df 100644
--- a/arch/sh/kernel/traps_32.c
+++ b/arch/sh/kernel/traps_32.c
@@ -537,6 +537,7 @@ uspace_segv:
537 "access (PC %lx PR %lx)\n", current->comm, regs->pc, 537 "access (PC %lx PR %lx)\n", current->comm, regs->pc,
538 regs->pr); 538 regs->pr);
539 539
540 clear_siginfo(&info);
540 info.si_signo = SIGBUS; 541 info.si_signo = SIGBUS;
541 info.si_errno = 0; 542 info.si_errno = 0;
542 info.si_code = si_code; 543 info.si_code = si_code;
@@ -600,6 +601,7 @@ asmlinkage void do_divide_error(unsigned long r4)
600{ 601{
601 siginfo_t info; 602 siginfo_t info;
602 603
604 clear_siginfo(&info);
603 switch (r4) { 605 switch (r4) {
604 case TRAP_DIVZERO_ERROR: 606 case TRAP_DIVZERO_ERROR:
605 info.si_code = FPE_INTDIV; 607 info.si_code = FPE_INTDIV;
diff --git a/arch/sh/math-emu/math.c b/arch/sh/math-emu/math.c
index c86f4360c6ce..d6d2213df078 100644
--- a/arch/sh/math-emu/math.c
+++ b/arch/sh/math-emu/math.c
@@ -560,6 +560,7 @@ static int ieee_fpe_handler(struct pt_regs *regs)
560 ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK); 560 ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK);
561 task_thread_info(tsk)->status |= TS_USEDFPU; 561 task_thread_info(tsk)->status |= TS_USEDFPU;
562 } else { 562 } else {
563 clear_siginfo(&info);
563 info.si_signo = SIGFPE; 564 info.si_signo = SIGFPE;
564 info.si_errno = 0; 565 info.si_errno = 0;
565 info.si_code = FPE_FLTINV; 566 info.si_code = FPE_FLTINV;
diff --git a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c
index 6fd1bf7481c7..4c98b6f20e02 100644
--- a/arch/sh/mm/fault.c
+++ b/arch/sh/mm/fault.c
@@ -44,6 +44,7 @@ force_sig_info_fault(int si_signo, int si_code, unsigned long address,
44{ 44{
45 siginfo_t info; 45 siginfo_t info;
46 46
47 clear_siginfo(&info);
47 info.si_signo = si_signo; 48 info.si_signo = si_signo;
48 info.si_errno = 0; 49 info.si_errno = 0;
49 info.si_code = si_code; 50 info.si_code = si_code;
diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c
index 454a8af28f13..2219e55206b4 100644
--- a/arch/sparc/kernel/process_64.c
+++ b/arch/sparc/kernel/process_64.c
@@ -520,6 +520,7 @@ static void stack_unaligned(unsigned long sp)
520{ 520{
521 siginfo_t info; 521 siginfo_t info;
522 522
523 clear_siginfo(&info);
523 info.si_signo = SIGBUS; 524 info.si_signo = SIGBUS;
524 info.si_errno = 0; 525 info.si_errno = 0;
525 info.si_code = BUS_ADRALN; 526 info.si_code = BUS_ADRALN;
diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c
index e8c3cb6b6d08..00f6353fe435 100644
--- a/arch/sparc/kernel/sys_sparc_32.c
+++ b/arch/sparc/kernel/sys_sparc_32.c
@@ -152,6 +152,7 @@ sparc_breakpoint (struct pt_regs *regs)
152#ifdef DEBUG_SPARC_BREAKPOINT 152#ifdef DEBUG_SPARC_BREAKPOINT
153 printk ("TRAP: Entering kernel PC=%x, nPC=%x\n", regs->pc, regs->npc); 153 printk ("TRAP: Entering kernel PC=%x, nPC=%x\n", regs->pc, regs->npc);
154#endif 154#endif
155 clear_siginfo(&info);
155 info.si_signo = SIGTRAP; 156 info.si_signo = SIGTRAP;
156 info.si_errno = 0; 157 info.si_errno = 0;
157 info.si_code = TRAP_BRKPT; 158 info.si_code = TRAP_BRKPT;
diff --git a/arch/sparc/kernel/traps_32.c b/arch/sparc/kernel/traps_32.c
index 33cd35bf3dc8..03e522274b8b 100644
--- a/arch/sparc/kernel/traps_32.c
+++ b/arch/sparc/kernel/traps_32.c
@@ -104,6 +104,7 @@ void do_hw_interrupt(struct pt_regs *regs, unsigned long type)
104 if(regs->psr & PSR_PS) 104 if(regs->psr & PSR_PS)
105 die_if_kernel("Kernel bad trap", regs); 105 die_if_kernel("Kernel bad trap", regs);
106 106
107 clear_siginfo(&info);
107 info.si_signo = SIGILL; 108 info.si_signo = SIGILL;
108 info.si_errno = 0; 109 info.si_errno = 0;
109 info.si_code = ILL_ILLTRP; 110 info.si_code = ILL_ILLTRP;
@@ -124,6 +125,7 @@ void do_illegal_instruction(struct pt_regs *regs, unsigned long pc, unsigned lon
124 regs->pc, *(unsigned long *)regs->pc); 125 regs->pc, *(unsigned long *)regs->pc);
125#endif 126#endif
126 127
128 clear_siginfo(&info);
127 info.si_signo = SIGILL; 129 info.si_signo = SIGILL;
128 info.si_errno = 0; 130 info.si_errno = 0;
129 info.si_code = ILL_ILLOPC; 131 info.si_code = ILL_ILLOPC;
@@ -139,6 +141,7 @@ void do_priv_instruction(struct pt_regs *regs, unsigned long pc, unsigned long n
139 141
140 if(psr & PSR_PS) 142 if(psr & PSR_PS)
141 die_if_kernel("Penguin instruction from Penguin mode??!?!", regs); 143 die_if_kernel("Penguin instruction from Penguin mode??!?!", regs);
144 clear_siginfo(&info);
142 info.si_signo = SIGILL; 145 info.si_signo = SIGILL;
143 info.si_errno = 0; 146 info.si_errno = 0;
144 info.si_code = ILL_PRVOPC; 147 info.si_code = ILL_PRVOPC;
@@ -165,6 +168,7 @@ void do_memaccess_unaligned(struct pt_regs *regs, unsigned long pc, unsigned lon
165 instruction_dump ((unsigned long *) regs->pc); 168 instruction_dump ((unsigned long *) regs->pc);
166 printk ("do_MNA!\n"); 169 printk ("do_MNA!\n");
167#endif 170#endif
171 clear_siginfo(&info);
168 info.si_signo = SIGBUS; 172 info.si_signo = SIGBUS;
169 info.si_errno = 0; 173 info.si_errno = 0;
170 info.si_code = BUS_ADRALN; 174 info.si_code = BUS_ADRALN;
@@ -303,6 +307,7 @@ void do_fpe_trap(struct pt_regs *regs, unsigned long pc, unsigned long npc,
303 } 307 }
304 308
305 fsr = fpt->thread.fsr; 309 fsr = fpt->thread.fsr;
310 clear_siginfo(&info);
306 info.si_signo = SIGFPE; 311 info.si_signo = SIGFPE;
307 info.si_errno = 0; 312 info.si_errno = 0;
308 info.si_addr = (void __user *)pc; 313 info.si_addr = (void __user *)pc;
@@ -336,6 +341,7 @@ void handle_tag_overflow(struct pt_regs *regs, unsigned long pc, unsigned long n
336 341
337 if(psr & PSR_PS) 342 if(psr & PSR_PS)
338 die_if_kernel("Penguin overflow trap from kernel mode", regs); 343 die_if_kernel("Penguin overflow trap from kernel mode", regs);
344 clear_siginfo(&info);
339 info.si_signo = SIGEMT; 345 info.si_signo = SIGEMT;
340 info.si_errno = 0; 346 info.si_errno = 0;
341 info.si_code = EMT_TAGOVF; 347 info.si_code = EMT_TAGOVF;
@@ -365,6 +371,7 @@ void handle_reg_access(struct pt_regs *regs, unsigned long pc, unsigned long npc
365 printk("Register Access Exception at PC %08lx NPC %08lx PSR %08lx\n", 371 printk("Register Access Exception at PC %08lx NPC %08lx PSR %08lx\n",
366 pc, npc, psr); 372 pc, npc, psr);
367#endif 373#endif
374 clear_siginfo(&info);
368 info.si_signo = SIGBUS; 375 info.si_signo = SIGBUS;
369 info.si_errno = 0; 376 info.si_errno = 0;
370 info.si_code = BUS_OBJERR; 377 info.si_code = BUS_OBJERR;
@@ -378,6 +385,7 @@ void handle_cp_disabled(struct pt_regs *regs, unsigned long pc, unsigned long np
378{ 385{
379 siginfo_t info; 386 siginfo_t info;
380 387
388 clear_siginfo(&info);
381 info.si_signo = SIGILL; 389 info.si_signo = SIGILL;
382 info.si_errno = 0; 390 info.si_errno = 0;
383 info.si_code = ILL_COPROC; 391 info.si_code = ILL_COPROC;
@@ -395,6 +403,7 @@ void handle_cp_exception(struct pt_regs *regs, unsigned long pc, unsigned long n
395 printk("Co-Processor Exception at PC %08lx NPC %08lx PSR %08lx\n", 403 printk("Co-Processor Exception at PC %08lx NPC %08lx PSR %08lx\n",
396 pc, npc, psr); 404 pc, npc, psr);
397#endif 405#endif
406 clear_siginfo(&info);
398 info.si_signo = SIGILL; 407 info.si_signo = SIGILL;
399 info.si_errno = 0; 408 info.si_errno = 0;
400 info.si_code = ILL_COPROC; 409 info.si_code = ILL_COPROC;
@@ -408,6 +417,7 @@ void handle_hw_divzero(struct pt_regs *regs, unsigned long pc, unsigned long npc
408{ 417{
409 siginfo_t info; 418 siginfo_t info;
410 419
420 clear_siginfo(&info);
411 info.si_signo = SIGFPE; 421 info.si_signo = SIGFPE;
412 info.si_errno = 0; 422 info.si_errno = 0;
413 info.si_code = FPE_INTDIV; 423 info.si_code = FPE_INTDIV;
diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c
index e81072ac52c3..b485b49b87a8 100644
--- a/arch/sparc/kernel/traps_64.c
+++ b/arch/sparc/kernel/traps_64.c
@@ -107,6 +107,7 @@ void bad_trap(struct pt_regs *regs, long lvl)
107 regs->tpc &= 0xffffffff; 107 regs->tpc &= 0xffffffff;
108 regs->tnpc &= 0xffffffff; 108 regs->tnpc &= 0xffffffff;
109 } 109 }
110 clear_siginfo(&info);
110 info.si_signo = SIGILL; 111 info.si_signo = SIGILL;
111 info.si_errno = 0; 112 info.si_errno = 0;
112 info.si_code = ILL_ILLTRP; 113 info.si_code = ILL_ILLTRP;
@@ -206,6 +207,7 @@ void spitfire_insn_access_exception(struct pt_regs *regs, unsigned long sfsr, un
206 regs->tpc &= 0xffffffff; 207 regs->tpc &= 0xffffffff;
207 regs->tnpc &= 0xffffffff; 208 regs->tnpc &= 0xffffffff;
208 } 209 }
210 clear_siginfo(&info);
209 info.si_signo = SIGSEGV; 211 info.si_signo = SIGSEGV;
210 info.si_errno = 0; 212 info.si_errno = 0;
211 info.si_code = SEGV_MAPERR; 213 info.si_code = SEGV_MAPERR;
@@ -247,6 +249,7 @@ void sun4v_insn_access_exception(struct pt_regs *regs, unsigned long addr, unsig
247 regs->tpc &= 0xffffffff; 249 regs->tpc &= 0xffffffff;
248 regs->tnpc &= 0xffffffff; 250 regs->tnpc &= 0xffffffff;
249 } 251 }
252 clear_siginfo(&info);
250 info.si_signo = SIGSEGV; 253 info.si_signo = SIGSEGV;
251 info.si_errno = 0; 254 info.si_errno = 0;
252 info.si_code = SEGV_MAPERR; 255 info.si_code = SEGV_MAPERR;
@@ -338,6 +341,7 @@ void spitfire_data_access_exception(struct pt_regs *regs, unsigned long sfsr, un
338 if (is_no_fault_exception(regs)) 341 if (is_no_fault_exception(regs))
339 return; 342 return;
340 343
344 clear_siginfo(&info);
341 info.si_signo = SIGSEGV; 345 info.si_signo = SIGSEGV;
342 info.si_errno = 0; 346 info.si_errno = 0;
343 info.si_code = SEGV_MAPERR; 347 info.si_code = SEGV_MAPERR;
@@ -595,6 +599,7 @@ static void spitfire_ue_log(unsigned long afsr, unsigned long afar, unsigned lon
595 regs->tpc &= 0xffffffff; 599 regs->tpc &= 0xffffffff;
596 regs->tnpc &= 0xffffffff; 600 regs->tnpc &= 0xffffffff;
597 } 601 }
602 clear_siginfo(&info);
598 info.si_signo = SIGBUS; 603 info.si_signo = SIGBUS;
599 info.si_errno = 0; 604 info.si_errno = 0;
600 info.si_code = BUS_OBJERR; 605 info.si_code = BUS_OBJERR;
@@ -2211,6 +2216,7 @@ bool sun4v_nonresum_error_user_handled(struct pt_regs *regs,
2211 addr += PAGE_SIZE; 2216 addr += PAGE_SIZE;
2212 } 2217 }
2213 } 2218 }
2219 clear_siginfo(&info);
2214 info.si_signo = SIGKILL; 2220 info.si_signo = SIGKILL;
2215 info.si_errno = 0; 2221 info.si_errno = 0;
2216 info.si_trapno = 0; 2222 info.si_trapno = 0;
@@ -2221,6 +2227,7 @@ bool sun4v_nonresum_error_user_handled(struct pt_regs *regs,
2221 if (attrs & SUN4V_ERR_ATTRS_PIO) { 2227 if (attrs & SUN4V_ERR_ATTRS_PIO) {
2222 siginfo_t info; 2228 siginfo_t info;
2223 2229
2230 clear_siginfo(&info);
2224 info.si_signo = SIGBUS; 2231 info.si_signo = SIGBUS;
2225 info.si_code = BUS_ADRERR; 2232 info.si_code = BUS_ADRERR;
2226 info.si_addr = (void __user *)sun4v_get_vaddr(regs); 2233 info.si_addr = (void __user *)sun4v_get_vaddr(regs);
@@ -2368,6 +2375,7 @@ static void do_fpe_common(struct pt_regs *regs)
2368 regs->tpc &= 0xffffffff; 2375 regs->tpc &= 0xffffffff;
2369 regs->tnpc &= 0xffffffff; 2376 regs->tnpc &= 0xffffffff;
2370 } 2377 }
2378 clear_siginfo(&info);
2371 info.si_signo = SIGFPE; 2379 info.si_signo = SIGFPE;
2372 info.si_errno = 0; 2380 info.si_errno = 0;
2373 info.si_addr = (void __user *)regs->tpc; 2381 info.si_addr = (void __user *)regs->tpc;
@@ -2440,6 +2448,7 @@ void do_tof(struct pt_regs *regs)
2440 regs->tpc &= 0xffffffff; 2448 regs->tpc &= 0xffffffff;
2441 regs->tnpc &= 0xffffffff; 2449 regs->tnpc &= 0xffffffff;
2442 } 2450 }
2451 clear_siginfo(&info);
2443 info.si_signo = SIGEMT; 2452 info.si_signo = SIGEMT;
2444 info.si_errno = 0; 2453 info.si_errno = 0;
2445 info.si_code = EMT_TAGOVF; 2454 info.si_code = EMT_TAGOVF;
@@ -2465,6 +2474,7 @@ void do_div0(struct pt_regs *regs)
2465 regs->tpc &= 0xffffffff; 2474 regs->tpc &= 0xffffffff;
2466 regs->tnpc &= 0xffffffff; 2475 regs->tnpc &= 0xffffffff;
2467 } 2476 }
2477 clear_siginfo(&info);
2468 info.si_signo = SIGFPE; 2478 info.si_signo = SIGFPE;
2469 info.si_errno = 0; 2479 info.si_errno = 0;
2470 info.si_code = FPE_INTDIV; 2480 info.si_code = FPE_INTDIV;
@@ -2666,6 +2676,7 @@ void do_illegal_instruction(struct pt_regs *regs)
2666 } 2676 }
2667 } 2677 }
2668 } 2678 }
2679 clear_siginfo(&info);
2669 info.si_signo = SIGILL; 2680 info.si_signo = SIGILL;
2670 info.si_errno = 0; 2681 info.si_errno = 0;
2671 info.si_code = ILL_ILLOPC; 2682 info.si_code = ILL_ILLOPC;
@@ -2692,6 +2703,7 @@ void mem_address_unaligned(struct pt_regs *regs, unsigned long sfar, unsigned lo
2692 if (is_no_fault_exception(regs)) 2703 if (is_no_fault_exception(regs))
2693 return; 2704 return;
2694 2705
2706 clear_siginfo(&info);
2695 info.si_signo = SIGBUS; 2707 info.si_signo = SIGBUS;
2696 info.si_errno = 0; 2708 info.si_errno = 0;
2697 info.si_code = BUS_ADRALN; 2709 info.si_code = BUS_ADRALN;
@@ -2717,6 +2729,7 @@ void sun4v_do_mna(struct pt_regs *regs, unsigned long addr, unsigned long type_c
2717 if (is_no_fault_exception(regs)) 2729 if (is_no_fault_exception(regs))
2718 return; 2730 return;
2719 2731
2732 clear_siginfo(&info);
2720 info.si_signo = SIGBUS; 2733 info.si_signo = SIGBUS;
2721 info.si_errno = 0; 2734 info.si_errno = 0;
2722 info.si_code = BUS_ADRALN; 2735 info.si_code = BUS_ADRALN;
@@ -2785,6 +2798,7 @@ void do_privop(struct pt_regs *regs)
2785 regs->tpc &= 0xffffffff; 2798 regs->tpc &= 0xffffffff;
2786 regs->tnpc &= 0xffffffff; 2799 regs->tnpc &= 0xffffffff;
2787 } 2800 }
2801 clear_siginfo(&info);
2788 info.si_signo = SIGILL; 2802 info.si_signo = SIGILL;
2789 info.si_errno = 0; 2803 info.si_errno = 0;
2790 info.si_code = ILL_PRVOPC; 2804 info.si_code = ILL_PRVOPC;
diff --git a/arch/sparc/kernel/unaligned_32.c b/arch/sparc/kernel/unaligned_32.c
index 7642d7e4f0d9..0e4cf7217413 100644
--- a/arch/sparc/kernel/unaligned_32.c
+++ b/arch/sparc/kernel/unaligned_32.c
@@ -313,6 +313,7 @@ static void user_mna_trap_fault(struct pt_regs *regs, unsigned int insn)
313{ 313{
314 siginfo_t info; 314 siginfo_t info;
315 315
316 clear_siginfo(&info);
316 info.si_signo = SIGBUS; 317 info.si_signo = SIGBUS;
317 info.si_errno = 0; 318 info.si_errno = 0;
318 info.si_code = BUS_ADRALN; 319 info.si_code = BUS_ADRALN;
diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c
index a8103a84b4ac..2deb586665b9 100644
--- a/arch/sparc/mm/fault_32.c
+++ b/arch/sparc/mm/fault_32.c
@@ -129,6 +129,7 @@ static void __do_fault_siginfo(int code, int sig, struct pt_regs *regs,
129{ 129{
130 siginfo_t info; 130 siginfo_t info;
131 131
132 clear_siginfo(&info);
132 info.si_signo = sig; 133 info.si_signo = sig;
133 info.si_code = code; 134 info.si_code = code;
134 info.si_errno = 0; 135 info.si_errno = 0;
diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c
index 41363f46797b..46ccff95d10e 100644
--- a/arch/sparc/mm/fault_64.c
+++ b/arch/sparc/mm/fault_64.c
@@ -172,6 +172,7 @@ static void do_fault_siginfo(int code, int sig, struct pt_regs *regs,
172 unsigned long addr; 172 unsigned long addr;
173 siginfo_t info; 173 siginfo_t info;
174 174
175 clear_siginfo(&info);
175 info.si_code = code; 176 info.si_code = code;
176 info.si_signo = sig; 177 info.si_signo = sig;
177 info.si_errno = 0; 178 info.si_errno = 0;
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c
index b2b02df9896e..d4d38520c4c6 100644
--- a/arch/um/kernel/trap.c
+++ b/arch/um/kernel/trap.c
@@ -164,6 +164,7 @@ static void bad_segv(struct faultinfo fi, unsigned long ip)
164{ 164{
165 struct siginfo si; 165 struct siginfo si;
166 166
167 clear_siginfo(&si);
167 si.si_signo = SIGSEGV; 168 si.si_signo = SIGSEGV;
168 si.si_code = SEGV_ACCERR; 169 si.si_code = SEGV_ACCERR;
169 si.si_addr = (void __user *) FAULT_ADDRESS(fi); 170 si.si_addr = (void __user *) FAULT_ADDRESS(fi);
@@ -220,6 +221,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user,
220 int is_write = FAULT_WRITE(fi); 221 int is_write = FAULT_WRITE(fi);
221 unsigned long address = FAULT_ADDRESS(fi); 222 unsigned long address = FAULT_ADDRESS(fi);
222 223
224 clear_siginfo(&si);
223 if (!is_user && regs) 225 if (!is_user && regs)
224 current->thread.segv_regs = container_of(regs, struct pt_regs, regs); 226 current->thread.segv_regs = container_of(regs, struct pt_regs, regs);
225 227
diff --git a/arch/unicore32/kernel/fpu-ucf64.c b/arch/unicore32/kernel/fpu-ucf64.c
index 12c8c9527b8e..d785955e1c29 100644
--- a/arch/unicore32/kernel/fpu-ucf64.c
+++ b/arch/unicore32/kernel/fpu-ucf64.c
@@ -56,7 +56,7 @@ void ucf64_raise_sigfpe(unsigned int sicode, struct pt_regs *regs)
56{ 56{
57 siginfo_t info; 57 siginfo_t info;
58 58
59 memset(&info, 0, sizeof(info)); 59 clear_siginfo(&info);
60 60
61 info.si_signo = SIGFPE; 61 info.si_signo = SIGFPE;
62 info.si_code = sicode; 62 info.si_code = sicode;
diff --git a/arch/unicore32/mm/fault.c b/arch/unicore32/mm/fault.c
index bbefcc46a45e..381473412937 100644
--- a/arch/unicore32/mm/fault.c
+++ b/arch/unicore32/mm/fault.c
@@ -125,6 +125,7 @@ static void __do_user_fault(struct task_struct *tsk, unsigned long addr,
125 tsk->thread.address = addr; 125 tsk->thread.address = addr;
126 tsk->thread.error_code = fsr; 126 tsk->thread.error_code = fsr;
127 tsk->thread.trap_no = 14; 127 tsk->thread.trap_no = 14;
128 clear_siginfo(&si);
128 si.si_signo = sig; 129 si.si_signo = sig;
129 si.si_errno = 0; 130 si.si_errno = 0;
130 si.si_code = code; 131 si.si_code = code;
@@ -472,6 +473,7 @@ asmlinkage void do_DataAbort(unsigned long addr, unsigned int fsr,
472 printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n", 473 printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n",
473 inf->name, fsr, addr); 474 inf->name, fsr, addr);
474 475
476 clear_siginfo(&info);
475 info.si_signo = inf->sig; 477 info.si_signo = inf->sig;
476 info.si_errno = 0; 478 info.si_errno = 0;
477 info.si_code = inf->code; 479 info.si_code = inf->code;
@@ -491,6 +493,7 @@ asmlinkage void do_PrefetchAbort(unsigned long addr,
491 printk(KERN_ALERT "Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n", 493 printk(KERN_ALERT "Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n",
492 inf->name, ifsr, addr); 494 inf->name, ifsr, addr);
493 495
496 clear_siginfo(&info);
494 info.si_signo = inf->sig; 497 info.si_signo = inf->sig;
495 info.si_errno = 0; 498 info.si_errno = 0;
496 info.si_code = inf->code; 499 info.si_code = inf->code;
diff --git a/arch/x86/entry/vsyscall/vsyscall_64.c b/arch/x86/entry/vsyscall/vsyscall_64.c
index 70b7845434cb..7782cdbcd67d 100644
--- a/arch/x86/entry/vsyscall/vsyscall_64.c
+++ b/arch/x86/entry/vsyscall/vsyscall_64.c
@@ -107,7 +107,7 @@ static bool write_ok_or_segv(unsigned long ptr, size_t size)
107 thread->cr2 = ptr; 107 thread->cr2 = ptr;
108 thread->trap_nr = X86_TRAP_PF; 108 thread->trap_nr = X86_TRAP_PF;
109 109
110 memset(&info, 0, sizeof(info)); 110 clear_siginfo(&info);
111 info.si_signo = SIGSEGV; 111 info.si_signo = SIGSEGV;
112 info.si_errno = 0; 112 info.si_errno = 0;
113 info.si_code = SEGV_MAPERR; 113 info.si_code = SEGV_MAPERR;
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
index ed5c4cdf0a34..e2ee403865eb 100644
--- a/arch/x86/kernel/ptrace.c
+++ b/arch/x86/kernel/ptrace.c
@@ -1377,7 +1377,6 @@ static void fill_sigtrap_info(struct task_struct *tsk,
1377 tsk->thread.trap_nr = X86_TRAP_DB; 1377 tsk->thread.trap_nr = X86_TRAP_DB;
1378 tsk->thread.error_code = error_code; 1378 tsk->thread.error_code = error_code;
1379 1379
1380 memset(info, 0, sizeof(*info));
1381 info->si_signo = SIGTRAP; 1380 info->si_signo = SIGTRAP;
1382 info->si_code = si_code; 1381 info->si_code = si_code;
1383 info->si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL; 1382 info->si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL;
@@ -1395,6 +1394,7 @@ void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
1395{ 1394{
1396 struct siginfo info; 1395 struct siginfo info;
1397 1396
1397 clear_siginfo(&info);
1398 fill_sigtrap_info(tsk, regs, error_code, si_code, &info); 1398 fill_sigtrap_info(tsk, regs, error_code, si_code, &info);
1399 /* Send us the fake SIGTRAP */ 1399 /* Send us the fake SIGTRAP */
1400 force_sig_info(SIGTRAP, &info, tsk); 1400 force_sig_info(SIGTRAP, &info, tsk);
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 03f3d7695dac..a535dd64de63 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -299,6 +299,7 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
299 if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) != 299 if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
300 NOTIFY_STOP) { 300 NOTIFY_STOP) {
301 cond_local_irq_enable(regs); 301 cond_local_irq_enable(regs);
302 clear_siginfo(&info);
302 do_trap(trapnr, signr, str, regs, error_code, 303 do_trap(trapnr, signr, str, regs, error_code,
303 fill_trap_info(regs, signr, trapnr, &info)); 304 fill_trap_info(regs, signr, trapnr, &info));
304 } 305 }
@@ -854,6 +855,7 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr)
854 855
855 task->thread.trap_nr = trapnr; 856 task->thread.trap_nr = trapnr;
856 task->thread.error_code = error_code; 857 task->thread.error_code = error_code;
858 clear_siginfo(&info);
857 info.si_signo = SIGFPE; 859 info.si_signo = SIGFPE;
858 info.si_errno = 0; 860 info.si_errno = 0;
859 info.si_addr = (void __user *)uprobe_get_trap_addr(regs); 861 info.si_addr = (void __user *)uprobe_get_trap_addr(regs);
@@ -929,6 +931,7 @@ dotraplinkage void do_iret_error(struct pt_regs *regs, long error_code)
929 RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU"); 931 RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
930 local_irq_enable(); 932 local_irq_enable();
931 933
934 clear_siginfo(&info);
932 info.si_signo = SIGILL; 935 info.si_signo = SIGILL;
933 info.si_errno = 0; 936 info.si_errno = 0;
934 info.si_code = ILL_BADSTK; 937 info.si_code = ILL_BADSTK;
diff --git a/arch/x86/kernel/umip.c b/arch/x86/kernel/umip.c
index f44ce0fb3583..ff20b35e98dd 100644
--- a/arch/x86/kernel/umip.c
+++ b/arch/x86/kernel/umip.c
@@ -278,6 +278,7 @@ static void force_sig_info_umip_fault(void __user *addr, struct pt_regs *regs)
278 tsk->thread.error_code = X86_PF_USER | X86_PF_WRITE; 278 tsk->thread.error_code = X86_PF_USER | X86_PF_WRITE;
279 tsk->thread.trap_nr = X86_TRAP_PF; 279 tsk->thread.trap_nr = X86_TRAP_PF;
280 280
281 clear_siginfo(&info);
281 info.si_signo = SIGSEGV; 282 info.si_signo = SIGSEGV;
282 info.si_errno = 0; 283 info.si_errno = 0;
283 info.si_code = SEGV_MAPERR; 284 info.si_code = SEGV_MAPERR;
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 8494dbae41b9..d634f0332c0f 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -3007,6 +3007,7 @@ static void kvm_send_hwpoison_signal(unsigned long address, struct task_struct *
3007{ 3007{
3008 siginfo_t info; 3008 siginfo_t info;
3009 3009
3010 clear_siginfo(&info);
3010 info.si_signo = SIGBUS; 3011 info.si_signo = SIGBUS;
3011 info.si_errno = 0; 3012 info.si_errno = 0;
3012 info.si_code = BUS_MCEERR_AR; 3013 info.si_code = BUS_MCEERR_AR;
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index 73bd8c95ac71..2a5a2920203d 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -209,6 +209,7 @@ force_sig_info_fault(int si_signo, int si_code, unsigned long address,
209 unsigned lsb = 0; 209 unsigned lsb = 0;
210 siginfo_t info; 210 siginfo_t info;
211 211
212 clear_siginfo(&info);
212 info.si_signo = si_signo; 213 info.si_signo = si_signo;
213 info.si_errno = 0; 214 info.si_errno = 0;
214 info.si_code = si_code; 215 info.si_code = si_code;
diff --git a/arch/xtensa/kernel/traps.c b/arch/xtensa/kernel/traps.c
index 32c5207f1226..51771929f341 100644
--- a/arch/xtensa/kernel/traps.c
+++ b/arch/xtensa/kernel/traps.c
@@ -334,6 +334,7 @@ do_unaligned_user (struct pt_regs *regs)
334 "(pid = %d, pc = %#010lx)\n", 334 "(pid = %d, pc = %#010lx)\n",
335 regs->excvaddr, current->comm, 335 regs->excvaddr, current->comm,
336 task_pid_nr(current), regs->pc); 336 task_pid_nr(current), regs->pc);
337 clear_siginfo(&info);
337 info.si_signo = SIGBUS; 338 info.si_signo = SIGBUS;
338 info.si_errno = 0; 339 info.si_errno = 0;
339 info.si_code = BUS_ADRALN; 340 info.si_code = BUS_ADRALN;
diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c
index 8b9b6f44bb06..f9323a3e61ce 100644
--- a/arch/xtensa/mm/fault.c
+++ b/arch/xtensa/mm/fault.c
@@ -45,6 +45,7 @@ void do_page_fault(struct pt_regs *regs)
45 int fault; 45 int fault;
46 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 46 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
47 47
48 clear_siginfo(&info);
48 info.si_code = SEGV_MAPERR; 49 info.si_code = SEGV_MAPERR;
49 50
50 /* We fault-in kernel-space virtual memory on-demand. The 51 /* We fault-in kernel-space virtual memory on-demand. The
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h
index 919b2a0b0307..037bf0ef1ae9 100644
--- a/include/linux/ptrace.h
+++ b/include/linux/ptrace.h
@@ -345,7 +345,6 @@ extern void user_single_step_siginfo(struct task_struct *tsk,
345static inline void user_single_step_siginfo(struct task_struct *tsk, 345static inline void user_single_step_siginfo(struct task_struct *tsk,
346 struct pt_regs *regs, siginfo_t *info) 346 struct pt_regs *regs, siginfo_t *info)
347{ 347{
348 memset(info, 0, sizeof(*info));
349 info->si_signo = SIGTRAP; 348 info->si_signo = SIGTRAP;
350} 349}
351#endif 350#endif
diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h
index 26c152122a42..4a8841963c2e 100644
--- a/include/linux/tracehook.h
+++ b/include/linux/tracehook.h
@@ -124,6 +124,7 @@ static inline void tracehook_report_syscall_exit(struct pt_regs *regs, int step)
124{ 124{
125 if (step) { 125 if (step) {
126 siginfo_t info; 126 siginfo_t info;
127 clear_siginfo(&info);
127 user_single_step_siginfo(current, regs, &info); 128 user_single_step_siginfo(current, regs, &info);
128 force_sig_info(SIGTRAP, &info, current); 129 force_sig_info(SIGTRAP, &info, current);
129 return; 130 return;
diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c
index 7f6a944db23d..8d90de213ce9 100644
--- a/virt/kvm/arm/mmu.c
+++ b/virt/kvm/arm/mmu.c
@@ -1401,6 +1401,7 @@ static void kvm_send_hwpoison_signal(unsigned long address,
1401{ 1401{
1402 siginfo_t info; 1402 siginfo_t info;
1403 1403
1404 clear_siginfo(&info);
1404 info.si_signo = SIGBUS; 1405 info.si_signo = SIGBUS;
1405 info.si_errno = 0; 1406 info.si_errno = 0;
1406 info.si_code = BUS_MCEERR_AR; 1407 info.si_code = BUS_MCEERR_AR;