signal: Ensure every siginfo we send has all bits initialized
authorEric W. Biederman <ebiederm@xmission.com>
Tue, 17 Apr 2018 20:26:37 +0000 (15:26 -0500)
committerEric W. Biederman <ebiederm@xmission.com>
Wed, 25 Apr 2018 15:40:51 +0000 (10:40 -0500)
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>
68 files changed:
arch/alpha/kernel/osf_sys.c
arch/alpha/kernel/signal.c
arch/alpha/kernel/traps.c
arch/alpha/mm/fault.c
arch/arc/mm/fault.c
arch/arm/kernel/ptrace.c
arch/arm/kernel/swp_emulate.c
arch/arm/kernel/traps.c
arch/arm/mm/alignment.c
arch/arm/mm/fault.c
arch/arm/vfp/vfpmodule.c
arch/arm64/kernel/fpsimd.c
arch/arm64/kernel/sys_compat.c
arch/arm64/kernel/traps.c
arch/arm64/mm/fault.c
arch/c6x/kernel/traps.c
arch/hexagon/kernel/traps.c
arch/hexagon/mm/vm_fault.c
arch/ia64/kernel/brl_emu.c
arch/ia64/kernel/signal.c
arch/ia64/kernel/traps.c
arch/ia64/kernel/unaligned.c
arch/ia64/mm/fault.c
arch/m68k/kernel/traps.c
arch/microblaze/kernel/exceptions.c
arch/microblaze/mm/fault.c
arch/mips/mm/fault.c
arch/nds32/kernel/traps.c
arch/nds32/mm/fault.c
arch/nios2/kernel/traps.c
arch/openrisc/kernel/traps.c
arch/openrisc/mm/fault.c
arch/parisc/kernel/ptrace.c
arch/parisc/kernel/traps.c
arch/parisc/kernel/unaligned.c
arch/parisc/math-emu/driver.c
arch/parisc/mm/fault.c
arch/powerpc/kernel/process.c
arch/powerpc/kernel/traps.c
arch/powerpc/mm/fault.c
arch/powerpc/platforms/cell/spufs/fault.c
arch/riscv/kernel/traps.c
arch/s390/kernel/traps.c
arch/s390/mm/fault.c
arch/sh/kernel/traps_32.c
arch/sh/math-emu/math.c
arch/sh/mm/fault.c
arch/sparc/kernel/process_64.c
arch/sparc/kernel/sys_sparc_32.c
arch/sparc/kernel/traps_32.c
arch/sparc/kernel/traps_64.c
arch/sparc/kernel/unaligned_32.c
arch/sparc/mm/fault_32.c
arch/sparc/mm/fault_64.c
arch/um/kernel/trap.c
arch/unicore32/kernel/fpu-ucf64.c
arch/unicore32/mm/fault.c
arch/x86/entry/vsyscall/vsyscall_64.c
arch/x86/kernel/ptrace.c
arch/x86/kernel/traps.c
arch/x86/kernel/umip.c
arch/x86/kvm/mmu.c
arch/x86/mm/fault.c
arch/xtensa/kernel/traps.c
arch/xtensa/mm/fault.c
include/linux/ptrace.h
include/linux/tracehook.h
virt/kvm/arm/mmu.c

index 2e02aef5a334888817c4d6d89d6220d3d96ececd..f5f154942aab6414f7903d626f3ebf637c5af4d0 100644 (file)
@@ -881,6 +881,7 @@ SYSCALL_DEFINE5(osf_setsysinfo, unsigned long, op, void __user *, buffer,
                        if (fex & IEEE_TRAP_ENABLE_DZE) si_code = FPE_FLTDIV;
                        if (fex & IEEE_TRAP_ENABLE_INV) si_code = FPE_FLTINV;
 
+                       clear_siginfo(&info);
                        info.si_signo = SIGFPE;
                        info.si_errno = 0;
                        info.si_code = si_code;
index 9ebb3bcbc626b20150a1f6ca31b51563a6f3042a..cd306e6023132074bf2e058a16d6779054060ad9 100644 (file)
@@ -221,6 +221,7 @@ do_sigreturn(struct sigcontext __user *sc)
        if (ptrace_cancel_bpt (current)) {
                siginfo_t info;
 
+               clear_siginfo(&info);
                info.si_signo = SIGTRAP;
                info.si_errno = 0;
                info.si_code = TRAP_BRKPT;
@@ -255,6 +256,7 @@ do_rt_sigreturn(struct rt_sigframe __user *frame)
        if (ptrace_cancel_bpt (current)) {
                siginfo_t info;
 
+               clear_siginfo(&info);
                info.si_signo = SIGTRAP;
                info.si_errno = 0;
                info.si_code = TRAP_BRKPT;
index f43bd05dede26ccb4beaa1a564253b0d0106a381..91636765dd6d37b4b7d5206f72beb42cb567f05b 100644 (file)
@@ -228,6 +228,7 @@ do_entArith(unsigned long summary, unsigned long write_mask,
        }
        die_if_kernel("Arithmetic fault", regs, 0, NULL);
 
+       clear_siginfo(&info);
        info.si_signo = SIGFPE;
        info.si_errno = 0;
        info.si_code = si_code;
@@ -241,6 +242,7 @@ do_entIF(unsigned long type, struct pt_regs *regs)
        siginfo_t info;
        int signo, code;
 
+       clear_siginfo(&info);
        if ((regs->ps & ~IPL_MAX) == 0) {
                if (type == 1) {
                        const unsigned int *data
@@ -430,6 +432,7 @@ do_entDbg(struct pt_regs *regs)
 
        die_if_kernel("Instruction fault", regs, 0, NULL);
 
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code = ILL_ILLOPC;
@@ -761,6 +764,8 @@ do_entUnaUser(void __user * va, unsigned long opcode,
        siginfo_t info;
        long error;
 
+       clear_siginfo(&info);
+
        /* Check the UAC bits to decide what the user wants us to do
           with the unaliged access.  */
 
index cd3c572ee9127f55e5a3079ac7fd7f8566eee8e9..7f2202a9f50a80381de07ad787fc103895c501bf 100644 (file)
@@ -91,6 +91,8 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
        siginfo_t info;
        unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
 
+       clear_siginfo(&info);
+
        /* As of EV6, a load into $31/$f31 is a prefetch, and never faults
           (or is suppressed by the PALcode).  Support that for older CPUs
           by ignoring such an instruction.  */
index a0b7bd6d030d698594b844886768f5ddc690b04b..b884bbd6f354ad6e01c3253bc44b6f7eb72f4765 100644 (file)
@@ -70,6 +70,8 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
        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.
index 7724b0f661b37b66f7ce67cce29d4575fedbb449..36718a4243589fe2ec0698e4867b1b227c8b9ef8 100644 (file)
@@ -205,6 +205,7 @@ void ptrace_break(struct task_struct *tsk, struct pt_regs *regs)
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo = SIGTRAP;
        info.si_errno = 0;
        info.si_code  = TRAP_BRKPT;
index 3bda08bee6747c94917e20993a0a76c220b735f8..dfcb456afadd00e6b0693f6fa9363ea987e0f2c7 100644 (file)
@@ -112,6 +112,7 @@ static void set_segfault(struct pt_regs *regs, unsigned long addr)
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        down_read(&current->mm->mmap_sem);
        if (find_vma(current->mm, addr) == NULL)
                info.si_code = SEGV_MAPERR;
index 5e3633c24e636575c19059cdb99bd247a666b5f5..2584f9066da3c544c5c507cb6834bf9aba1ff258 100644 (file)
@@ -439,6 +439,7 @@ asmlinkage void do_undefinstr(struct pt_regs *regs)
        siginfo_t info;
        void __user *pc;
 
+       clear_siginfo(&info);
        pc = (void __user *)instruction_pointer(regs);
 
        if (processor_mode(regs) == SVC_MODE) {
@@ -537,6 +538,7 @@ static int bad_syscall(int n, struct pt_regs *regs)
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        if ((current->personality & PER_MASK) != PER_LINUX) {
                send_sig(SIGSEGV, current, 1);
                return regs->ARM_r0;
@@ -604,6 +606,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        if ((no >> 16) != (__ARM_NR_BASE>> 16))
                return bad_syscall(no, regs);
 
@@ -740,6 +743,8 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs)
        unsigned long addr = instruction_pointer(regs);
        siginfo_t info;
 
+       clear_siginfo(&info);
+
 #ifdef CONFIG_DEBUG_USER
        if (user_debug & UDBG_BADABORT) {
                pr_err("[%d] %s: bad data abort: code %d instr 0x%08lx\n",
index 2c96190e018bd634ad3249b352d792598ccc08d4..bd2c739d80839bac052d4af850afed32c246358c 100644 (file)
@@ -950,6 +950,7 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
        if (ai_usermode & UM_SIGNAL) {
                siginfo_t si;
 
+               clear_siginfo(&si);
                si.si_signo = SIGBUS;
                si.si_errno = 0;
                si.si_code = BUS_ADRALN;
index b75eada23d0a3be3e635b612adb431e5c06e34ef..32034543f49c13c77aed2cc0770cc8114e0b37ae 100644 (file)
@@ -163,6 +163,8 @@ __do_user_fault(struct task_struct *tsk, unsigned long addr,
 {
        struct siginfo si;
 
+       clear_siginfo(&si);
+
 #ifdef CONFIG_DEBUG_USER
        if (((user_debug & UDBG_SEGV) && (sig == SIGSEGV)) ||
            ((user_debug & UDBG_BUS)  && (sig == SIGBUS))) {
@@ -557,6 +559,7 @@ do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
                inf->name, fsr, addr);
        show_pte(current->mm, addr);
 
+       clear_siginfo(&info);
        info.si_signo = inf->sig;
        info.si_errno = 0;
        info.si_code  = inf->code;
@@ -589,6 +592,7 @@ do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *regs)
        pr_alert("Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n",
                inf->name, ifsr, addr);
 
+       clear_siginfo(&info);
        info.si_signo = inf->sig;
        info.si_errno = 0;
        info.si_code  = inf->code;
index 4c375e11ae9531bec8b5a05bd14ab8424ccd6653..adda3fc2dde831101f206d99b9531019f2dda0c6 100644 (file)
@@ -218,8 +218,7 @@ static void vfp_raise_sigfpe(unsigned int sicode, struct pt_regs *regs)
 {
        siginfo_t info;
 
-       memset(&info, 0, sizeof(info));
-
+       clear_siginfo(&info);
        info.si_signo = SIGFPE;
        info.si_code = sicode;
        info.si_addr = (void __user *)(instruction_pointer(regs) - 4);
index 87a35364e750c4fd55a2780a974689aafb4b929e..4bcdd03187298312704b92302a7a8fb47eebba53 100644 (file)
@@ -882,7 +882,7 @@ asmlinkage void do_fpsimd_exc(unsigned int esr, struct pt_regs *regs)
                        si_code = FPE_FLTRES;
        }
 
-       memset(&info, 0, sizeof(info));
+       clear_siginfo(&info);
        info.si_signo = SIGFPE;
        info.si_code = si_code;
        info.si_addr = (void __user *)instruction_pointer(regs);
index 93ab57dcfc14e430a4a7319d8fca2d8370c6baf2..a6109825eeb97133b8cbccc9a7fe98d2f11f14e4 100644 (file)
@@ -112,6 +112,7 @@ long compat_arm_syscall(struct pt_regs *regs)
                break;
        }
 
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code  = ILL_ILLTRP;
index ba964da31a252dd2ea517b2b7a4dcef06daa0f7b..7f476586cacc2417635c3fa4e0d1fd500d2e2222 100644 (file)
@@ -634,6 +634,7 @@ asmlinkage void bad_el0_sync(struct pt_regs *regs, int reason, unsigned int esr)
        siginfo_t info;
        void __user *pc = (void __user *)instruction_pointer(regs);
 
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code  = ILL_ILLOPC;
index 4165485e8b6ecbc60f161d98c20139992877c416..91c53a7d2575f4a7b1c0cad5728e8d489ce3b910 100644 (file)
@@ -305,11 +305,12 @@ static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *re
         */
        if (user_mode(regs)) {
                const struct fault_info *inf = esr_to_fault_info(esr);
-               struct siginfo si = {
-                       .si_signo       = inf->sig,
-                       .si_code        = inf->code,
-                       .si_addr        = (void __user *)addr,
-               };
+               struct siginfo si;
+
+               clear_siginfo(&si);
+               si.si_signo     = inf->sig;
+               si.si_code      = inf->code;
+               si.si_addr      = (void __user *)addr;
 
                __do_user_fault(&si, esr);
        } else {
@@ -583,6 +584,7 @@ static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs)
                        nmi_exit();
        }
 
+       clear_siginfo(&info);
        info.si_signo = inf->sig;
        info.si_errno = 0;
        info.si_code  = inf->code;
@@ -687,6 +689,7 @@ asmlinkage void __exception do_mem_abort(unsigned long addr, unsigned int esr,
                show_pte(addr);
        }
 
+       clear_siginfo(&info);
        info.si_signo = inf->sig;
        info.si_errno = 0;
        info.si_code  = inf->code;
@@ -729,6 +732,7 @@ asmlinkage void __exception do_sp_pc_abort(unsigned long addr,
                local_irq_enable();
        }
 
+       clear_siginfo(&info);
        info.si_signo = SIGBUS;
        info.si_errno = 0;
        info.si_code  = BUS_ADRALN;
@@ -772,7 +776,6 @@ asmlinkage int __exception do_debug_exception(unsigned long addr,
                                              struct pt_regs *regs)
 {
        const struct fault_info *inf = debug_fault_info + DBG_ESR_EVT(esr);
-       struct siginfo info;
        int rv;
 
        /*
@@ -788,6 +791,9 @@ asmlinkage int __exception do_debug_exception(unsigned long addr,
        if (!inf->fn(addr, esr, regs)) {
                rv = 1;
        } else {
+               struct siginfo info;
+
+               clear_siginfo(&info);
                info.si_signo = inf->sig;
                info.si_errno = 0;
                info.si_code  = inf->code;
index 4c1d4b84dd2b8865ea86f696ff84f60eb350dd5c..c5feee4542b0ef2eafb24a44a7699ffcd84fc58e 100644 (file)
@@ -246,6 +246,7 @@ static void do_trap(struct exception_info *except_info, struct pt_regs *regs)
        unsigned long addr = instruction_pointer(regs);
        siginfo_t info;
 
+       clear_siginfo(&info);
        if (except_info->code != TRAP_BRKPT)
                pr_err("TRAP: %s PC[0x%lx] signo[%d] code[%d]\n",
                       except_info->kernel_str, regs->pc,
index 2942a9204a9aad6ed14a2d15784a00e10de7fe82..1ff6a6a7b97c1f07000ee1c049315fc7153808f3 100644 (file)
@@ -414,6 +414,7 @@ void do_trap0(struct pt_regs *regs)
                if (user_mode(regs)) {
                        struct siginfo info;
 
+                       clear_siginfo(&info);
                        info.si_signo = SIGTRAP;
                        info.si_errno = 0;
                        /*
index 3eec33c5cfd716d169fefc8e4b0deee6e78bece4..2ad92edc877c5bde038dc72fb3c4def6f9a8efe4 100644 (file)
@@ -56,6 +56,7 @@ void do_page_fault(unsigned long address, long cause, struct pt_regs *regs)
        const struct exception_table_entry *fixup;
        unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
 
+       clear_siginfo(&info);
        /*
         * If we're in an interrupt or have no user context,
         * then must not take the fault.
index 9bcc908bc85e9e3678f4e843203ea8d2b7a106d4..a61f6c6a36f838d70a384738b7cb8ae9d48b117a 100644 (file)
@@ -62,6 +62,7 @@ ia64_emulate_brl (struct pt_regs *regs, unsigned long ar_ec)
        struct illegal_op_return rv;
        long tmp_taken, unimplemented_address;
 
+       clear_siginfo(&siginfo);
        rv.fkt = (unsigned long) -1;
 
        /*
index 54547c7cf8a2f294ae01bf0be9ac981714bdc518..d1234a5ba4c55e79a1b43366b4093925ad085698 100644 (file)
@@ -153,6 +153,7 @@ ia64_rt_sigreturn (struct sigscratch *scr)
        return retval;
 
   give_sigsegv:
+       clear_siginfo(&si);
        si.si_signo = SIGSEGV;
        si.si_errno = 0;
        si.si_code = SI_KERNEL;
@@ -236,6 +237,7 @@ force_sigsegv_info (int sig, void __user *addr)
        unsigned long flags;
        struct siginfo si;
 
+       clear_siginfo(&si);
        if (sig == SIGSEGV) {
                /*
                 * Acquiring siglock around the sa_handler-update is almost
index 6d4e76a4267f15d6ee39d2e055cd22f1eea40db4..972873ed1ae50ffe7f6112cf34c8126404a087fd 100644 (file)
@@ -104,6 +104,7 @@ __kprobes ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
        int sig, code;
 
        /* SIGILL, SIGFPE, SIGSEGV, and SIGBUS want these field initialized: */
+       clear_siginfo(&siginfo);
        siginfo.si_addr = (void __user *) (regs->cr_iip + ia64_psr(regs)->ri);
        siginfo.si_imm = break_num;
        siginfo.si_flags = 0;           /* clear __ISR_VALID */
@@ -293,7 +294,6 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr)
 {
        long exception, bundle[2];
        unsigned long fault_ip;
-       struct siginfo siginfo;
 
        fault_ip = regs->cr_iip;
        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)
                        printk(KERN_ERR "handle_fpu_swa: fp_emulate() returned -1\n");
                        return -1;
                } else {
+                       struct siginfo siginfo;
+
                        /* is next instruction a trap? */
                        if (exception & 2) {
                                ia64_increment_ip(regs);
                        }
+                       clear_siginfo(&siginfo);
                        siginfo.si_signo = SIGFPE;
                        siginfo.si_errno = 0;
                        siginfo.si_code = FPE_FIXME;    /* default code */
@@ -372,6 +375,9 @@ handle_fpu_swa (int fp_fault, struct pt_regs *regs, unsigned long isr)
                        return -1;
                } else if (exception != 0) {
                        /* raise exception */
+                       struct siginfo siginfo;
+
+                       clear_siginfo(&siginfo);
                        siginfo.si_signo = SIGFPE;
                        siginfo.si_errno = 0;
                        siginfo.si_code = FPE_FIXME;    /* default code */
@@ -420,7 +426,7 @@ ia64_illegal_op_fault (unsigned long ec, long arg1, long arg2, long arg3,
        if (die_if_kernel(buf, &regs, 0))
                return rv;
 
-       memset(&si, 0, sizeof(si));
+       clear_siginfo(&si);
        si.si_signo = SIGILL;
        si.si_code = ILL_ILLOPC;
        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,
            long arg7, struct pt_regs regs)
 {
        unsigned long code, error = isr, iip;
-       struct siginfo siginfo;
        char buf[128];
        int result, sig;
        static const char *reason[] = {
@@ -485,6 +490,7 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
 
              case 26: /* NaT Consumption */
                if (user_mode(&regs)) {
+                       struct siginfo siginfo;
                        void __user *addr;
 
                        if (((isr >> 4) & 0xf) == 2) {
@@ -499,6 +505,7 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
                                addr = (void __user *) (regs.cr_iip
                                                        + ia64_psr(&regs)->ri);
                        }
+                       clear_siginfo(&siginfo);
                        siginfo.si_signo = sig;
                        siginfo.si_code = code;
                        siginfo.si_errno = 0;
@@ -515,6 +522,9 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
 
              case 31: /* Unsupported Data Reference */
                if (user_mode(&regs)) {
+                       struct siginfo siginfo;
+
+                       clear_siginfo(&siginfo);
                        siginfo.si_signo = SIGILL;
                        siginfo.si_code = ILL_ILLOPN;
                        siginfo.si_errno = 0;
@@ -531,6 +541,10 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
              case 29: /* Debug */
              case 35: /* Taken Branch Trap */
              case 36: /* Single Step Trap */
+             {
+               struct siginfo siginfo;
+
+               clear_siginfo(&siginfo);
                if (fsys_mode(current, &regs)) {
                        extern char __kernel_syscall_via_break[];
                        /*
@@ -578,11 +592,15 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
                siginfo.si_isr   = isr;
                force_sig_info(SIGTRAP, &siginfo, current);
                return;
+             }
 
              case 32: /* fp fault */
              case 33: /* fp trap */
                result = handle_fpu_swa((vector == 32) ? 1 : 0, &regs, isr);
                if ((result < 0) || (current->thread.flags & IA64_THREAD_FPEMU_SIGFPE)) {
+                       struct siginfo siginfo;
+
+                       clear_siginfo(&siginfo);
                        siginfo.si_signo = SIGFPE;
                        siginfo.si_errno = 0;
                        siginfo.si_code = FPE_FLTINV;
@@ -616,6 +634,9 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
                } else {
                        /* Unimplemented Instr. Address Trap */
                        if (user_mode(&regs)) {
+                               struct siginfo siginfo;
+
+                               clear_siginfo(&siginfo);
                                siginfo.si_signo = SIGILL;
                                siginfo.si_code = ILL_BADIADDR;
                                siginfo.si_errno = 0;
index 72e9b42425642459450d4900432aad861737b865..e309f9859acc31c29f4991749a161c03b6b883d3 100644 (file)
@@ -1537,6 +1537,7 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs)
                /* NOT_REACHED */
        }
   force_sigbus:
+       clear_siginfo(&si);
        si.si_signo = SIGBUS;
        si.si_errno = 0;
        si.si_code = BUS_ADRALN;
index dfdc152d6737b3176c6b8fe74c115e377212eae9..817fa120645f1166f39e19fcf871bb98b102d72d 100644 (file)
@@ -85,7 +85,6 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
        int signal = SIGSEGV, code = SEGV_MAPERR;
        struct vm_area_struct *vma, *prev_vma;
        struct mm_struct *mm = current->mm;
-       struct siginfo si;
        unsigned long mask;
        int fault;
        unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
@@ -249,6 +248,9 @@ retry:
                return;
        }
        if (user_mode(regs)) {
+               struct siginfo si;
+
+               clear_siginfo(&si);
                si.si_signo = signal;
                si.si_errno = 0;
                si.si_code = code;
index c1cc4e99aa945dd1a14cc6a7561c1b58f3b5f2fa..0a00b476236db87982ac837ee148e87c4528402e 100644 (file)
@@ -1011,6 +1011,7 @@ asmlinkage void trap_c(struct frame *fp)
        int vector = (fp->ptregs.vector >> 2) & 0xff;
        siginfo_t info;
 
+       clear_siginfo(&info);
        if (fp->ptregs.sr & PS_S) {
                if (vector == VEC_TRACE) {
                        /* traced a trapping instruction on a 68020/30,
@@ -1163,6 +1164,7 @@ asmlinkage void fpemu_signal(int signal, int code, void *addr)
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo = signal;
        info.si_errno = 0;
        info.si_code = code;
index e6f338d0496bbd99cc90a01248458e8f770fd8ca..443ec1feacb4f2b8a49cab96ac357a5b401399a3 100644 (file)
@@ -65,6 +65,7 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
        if (kernel_mode(regs))
                die("Exception in kernel mode", regs, signr);
 
+       clear_siginfo(&info);
        info.si_signo = signr;
        info.si_errno = 0;
        info.si_code = code;
index f91b30f8aaa8c112b129b95bbaefcc70980eb391..43d92167012acae55b39f681c276e34d9ae16904 100644 (file)
@@ -88,7 +88,6 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
 {
        struct vm_area_struct *vma;
        struct mm_struct *mm = current->mm;
-       siginfo_t info;
        int code = SEGV_MAPERR;
        int is_write = error_code & ESR_S;
        int fault;
@@ -295,6 +294,9 @@ out_of_memory:
 do_sigbus:
        up_read(&mm->mmap_sem);
        if (user_mode(regs)) {
+               siginfo_t info;
+
+               clear_siginfo(&info);
                info.si_signo = SIGBUS;
                info.si_errno = 0;
                info.si_code = BUS_ADRERR;
index 4f8f5bf46977a3c134ce47df543a3e8a540226f2..75392becd933269dc3bb312e5f242692ce94feaf 100644 (file)
@@ -63,6 +63,7 @@ static void __kprobes __do_page_fault(struct pt_regs *regs, unsigned long write,
                return;
 #endif
 
+       clear_siginfo(&info);
        info.si_code = SEGV_MAPERR;
 
        /*
index 8e9a5b1f6234dc6ae03367e56716e52b741e9329..46911768f4b57e23360008438c52edbc2ca66d90 100644 (file)
@@ -229,6 +229,7 @@ int bad_syscall(int n, struct pt_regs *regs)
                return regs->uregs[0];
        }
 
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code = ILL_ILLTRP;
@@ -292,7 +293,7 @@ void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
        tsk->thread.trap_no = ENTRY_DEBUG_RELATED;
        tsk->thread.error_code = error_code;
 
-       memset(&info, 0, sizeof(info));
+       clear_siginfo(&info);
        info.si_signo = SIGTRAP;
        info.si_code = si_code;
        info.si_addr = (void __user *)instruction_pointer(regs);
index 3a246fb8098ca727da099096f0301472eb1ba537..876ee01ff80aad1a03d06584828024c66cca5c51 100644 (file)
@@ -77,6 +77,7 @@ void do_page_fault(unsigned long entry, unsigned long addr,
        unsigned int mask = VM_READ | VM_WRITE | VM_EXEC;
        unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
 
+       clear_siginfo(&info);
        error_code = error_code & (ITYPE_mskINST | ITYPE_mskETYPE);
        tsk = current;
        mm = tsk->mm;
index 8184e7d6b3857d3a9588b556e89f76b5a6d42c6a..a69861d3e1a3b2c30cd2e3ce76d24a1c69b0abb0 100644 (file)
@@ -28,6 +28,7 @@ static void _send_sig(int signo, int code, unsigned long addr)
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo = signo;
        info.si_errno = 0;
        info.si_code = code;
index 113c175fe469e5199c336e34a307d04fe747886d..1610b1d65a11866c54838c0bd205ff5fe4ad309c 100644 (file)
@@ -251,7 +251,7 @@ void __init trap_init(void)
 asmlinkage void do_trap(struct pt_regs *regs, unsigned long address)
 {
        siginfo_t info;
-       memset(&info, 0, sizeof(info));
+       clear_siginfo(&info);
        info.si_signo = SIGTRAP;
        info.si_code = TRAP_TRACE;
        info.si_addr = (void *)address;
@@ -266,6 +266,7 @@ asmlinkage void do_unaligned_access(struct pt_regs *regs, unsigned long address)
 
        if (user_mode(regs)) {
                /* Send a SIGBUS */
+               clear_siginfo(&info);
                info.si_signo = SIGBUS;
                info.si_errno = 0;
                info.si_code = BUS_ADRALN;
@@ -285,6 +286,7 @@ asmlinkage void do_bus_fault(struct pt_regs *regs, unsigned long address)
 
        if (user_mode(regs)) {
                /* Send a SIGBUS */
+               clear_siginfo(&info);
                info.si_signo = SIGBUS;
                info.si_errno = 0;
                info.si_code = BUS_ADRERR;
@@ -485,6 +487,7 @@ asmlinkage void do_illegal_instruction(struct pt_regs *regs,
 
        if (user_mode(regs)) {
                /* Send a SIGILL */
+               clear_siginfo(&info);
                info.si_signo = SIGILL;
                info.si_errno = 0;
                info.si_code = ILL_ILLOPC;
index d0021dfae20ad24649f20eab77f234ea2c598a22..68be33e4ae177078a9c789d817fd66f6f652e9d2 100644 (file)
@@ -56,6 +56,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long address,
        int fault;
        unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
 
+       clear_siginfo(&info);
        tsk = current;
 
        /*
index 1a2be6e639b5a8cc3b2a28652bc089f69e59132d..b1c12ceb1c88489ce0aef5544731e8881866d111 100644 (file)
@@ -90,6 +90,7 @@ void user_enable_single_step(struct task_struct *task)
                ptrace_disable(task);
                /* Don't wake up the task, but let the
                   parent know something happened. */
+               clear_siginfo(&si);
                si.si_code = TRAP_TRACE;
                si.si_addr = (void __user *) (task_regs(task)->iaoq[0] & ~3);
                si.si_signo = SIGTRAP;
index 68e671a11987a6f2fe3de6823e8e3e1ed497334d..98f9f2f8594092bbb84b27769c77e5b457db58dd 100644 (file)
@@ -299,6 +299,7 @@ static void handle_gdb_break(struct pt_regs *regs, int wot)
 {
        struct siginfo si;
 
+       clear_siginfo(&si);
        si.si_signo = SIGTRAP;
        si.si_errno = 0;
        si.si_code = wot;
@@ -489,6 +490,7 @@ void notrace handle_interruption(int code, struct pt_regs *regs)
        unsigned long fault_space = 0;
        struct siginfo si;
 
+       clear_siginfo(&si);
        if (code == 1)
            pdc_console_restart();  /* switch back to pdc if HPMC */
        else
index e36f7b75ab07b3275a5af086cb4ab22dd6102119..30b7c7f6c471d550728db9bfce9d1e2720e264e6 100644 (file)
@@ -455,6 +455,7 @@ void handle_unaligned(struct pt_regs *regs)
        struct siginfo si;
        register int flop=0;    /* true if this is a flop */
 
+       clear_siginfo(&si);
        __inc_irq_stat(irq_unaligned_count);
 
        /* log a message with pacing */
index 2fb59d2e2b294bb38484da2b72a49f64a816b4a2..0d10efb53361204744793d41b9c08ec8eb768b46 100644 (file)
@@ -93,6 +93,7 @@ handle_fpe(struct pt_regs *regs)
         */
        __u64 frcopy[36];
 
+       clear_siginfo(&si);
        memcpy(frcopy, regs->fr, sizeof regs->fr);
        frcopy[32] = 0;
 
index e247edbca68ecd2f56500e467776c9d2fa1f1c11..657b35096bd8315a87b525c390e147f2bfe7dbff 100644 (file)
@@ -356,6 +356,7 @@ bad_area:
                struct siginfo si;
                unsigned int lsb = 0;
 
+               clear_siginfo(&si);
                switch (code) {
                case 15:        /* Data TLB miss fault/Data page fault */
                        /* send SIGSEGV when outside of vma */
index 1237f13fed51862cbb5d7d2117c686cc06b2852b..26ea9793d2902f3618356126557aad5db4c1a0de 100644 (file)
@@ -632,6 +632,7 @@ void do_break (struct pt_regs *regs, unsigned long address,
        hw_breakpoint_disable();
 
        /* Deliver the signal to userspace */
+       clear_siginfo(&info);
        info.si_signo = SIGTRAP;
        info.si_errno = 0;
        info.si_code = TRAP_HWBKPT;
index 0904492e7032eb4ba4409e54cadb1a74ef4df74f..087855caf6a92eb9559c43bbd7ed6e37af38f701 100644 (file)
@@ -296,7 +296,6 @@ NOKPROBE_SYMBOL(die);
 void user_single_step_siginfo(struct task_struct *tsk,
                                struct pt_regs *regs, siginfo_t *info)
 {
-       memset(info, 0, sizeof(*info));
        info->si_signo = SIGTRAP;
        info->si_code = TRAP_TRACE;
        info->si_addr = (void __user *)regs->nip;
@@ -334,7 +333,7 @@ void _exception_pkey(int signr, struct pt_regs *regs, int code,
         */
        thread_pkey_regs_save(&current->thread);
 
-       memset(&info, 0, sizeof(info));
+       clear_siginfo(&info);
        info.si_signo = signr;
        info.si_code = code;
        info.si_addr = (void __user *) addr;
index c01d627e687ae1952c297f4f7b1225a62fc8956c..ef268d5d9db739e65ea4cf045555fb84eab474f9 100644 (file)
@@ -168,6 +168,7 @@ static int do_sigbus(struct pt_regs *regs, unsigned long address,
                return SIGBUS;
 
        current->thread.trap_nr = BUS_ADRERR;
+       clear_siginfo(&info);
        info.si_signo = SIGBUS;
        info.si_errno = 0;
        info.si_code = BUS_ADRERR;
index 870c0a82d560deff5446b93fc3f84077dcc6bfcf..1e002e94d0f6121100839c3e0cd5536bee92eac5 100644 (file)
@@ -44,7 +44,7 @@ static void spufs_handle_event(struct spu_context *ctx,
                return;
        }
 
-       memset(&info, 0, sizeof(info));
+       clear_siginfo(&info);
 
        switch (type) {
        case SPE_EVENT_INVALID_DMA:
index 93132cb59184816f565e057c95b8837bf995088c..48aa6471cede36b6f8498d85e3f0623264d63781 100644 (file)
@@ -68,6 +68,7 @@ static inline void do_trap_siginfo(int signo, int code,
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo = signo;
        info.si_errno = 0;
        info.si_code = code;
index a5297a22bc1eafc1b7f8b6d2b1b8f8595b601203..3ba649d8aa5a6a4e6756c293ef6d7b1778a181e9 100644 (file)
@@ -47,6 +47,7 @@ void do_report_trap(struct pt_regs *regs, int si_signo, int si_code, char *str)
        siginfo_t info;
 
        if (user_mode(regs)) {
+               clear_siginfo(&info);
                info.si_signo = si_signo;
                info.si_errno = 0;
                info.si_code = si_code;
@@ -86,6 +87,7 @@ void do_per_trap(struct pt_regs *regs)
                return;
        if (!current->ptrace)
                return;
+       clear_siginfo(&info);
        info.si_signo = SIGTRAP;
        info.si_errno = 0;
        info.si_code = TRAP_HWBKPT;
@@ -165,7 +167,6 @@ void translation_exception(struct pt_regs *regs)
 
 void illegal_op(struct pt_regs *regs)
 {
-       siginfo_t info;
         __u8 opcode[6];
        __u16 __user *location;
        int is_uprobe_insn = 0;
@@ -178,6 +179,8 @@ void illegal_op(struct pt_regs *regs)
                        return;
                if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) {
                        if (current->ptrace) {
+                               siginfo_t info;
+                               clear_siginfo(&info);
                                info.si_signo = SIGTRAP;
                                info.si_errno = 0;
                                info.si_code = TRAP_BRKPT;
index 93faeca522841ba4e1aec2164f52e476b8c265bf..b3ff0e8e58603b31412b45ed5f39f3b6144c8e21 100644 (file)
@@ -268,6 +268,7 @@ static noinline void do_sigsegv(struct pt_regs *regs, int si_code)
        struct siginfo si;
 
        report_user_fault(regs, SIGSEGV, 1);
+       clear_siginfo(&si);
        si.si_signo = SIGSEGV;
        si.si_errno = 0;
        si.si_code = si_code;
@@ -323,6 +324,7 @@ static noinline void do_sigbus(struct pt_regs *regs)
         * Send a sigbus, regardless of whether we were in kernel
         * or user mode.
         */
+       clear_siginfo(&si);
        si.si_signo = SIGBUS;
        si.si_errno = 0;
        si.si_code = BUS_ADRERR;
index b3770bb26211319062a84eb73992f3309196384b..e85e59c3d6dff66e59b243fbd0ef995f538bd840 100644 (file)
@@ -537,6 +537,7 @@ uspace_segv:
                       "access (PC %lx PR %lx)\n", current->comm, regs->pc,
                       regs->pr);
 
+               clear_siginfo(&info);
                info.si_signo = SIGBUS;
                info.si_errno = 0;
                info.si_code = si_code;
@@ -600,6 +601,7 @@ asmlinkage void do_divide_error(unsigned long r4)
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        switch (r4) {
        case TRAP_DIVZERO_ERROR:
                info.si_code = FPE_INTDIV;
index c86f4360c6cee5d963c06f7434c769f6d7d897f7..d6d2213df078796d4a0b59653a14f56aa8bf9d57 100644 (file)
@@ -560,6 +560,7 @@ static int ieee_fpe_handler(struct pt_regs *regs)
                                ~(FPSCR_CAUSE_MASK | FPSCR_FLAG_MASK);
                        task_thread_info(tsk)->status |= TS_USEDFPU;
                } else {
+                       clear_siginfo(&info);
                        info.si_signo = SIGFPE;
                        info.si_errno = 0;
                        info.si_code = FPE_FLTINV;
index 6fd1bf7481c7d83674d76fe66dbdc1f89f74c2ee..4c98b6f20e0226de25074bc0e47aa76f2cd93a2d 100644 (file)
@@ -44,6 +44,7 @@ force_sig_info_fault(int si_signo, int si_code, unsigned long address,
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo   = si_signo;
        info.si_errno   = 0;
        info.si_code    = si_code;
index 454a8af28f13bb6c185fd66d46160338d84d94e3..2219e55206b4abef776537c6b380dc609bfa16f3 100644 (file)
@@ -520,6 +520,7 @@ static void stack_unaligned(unsigned long sp)
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo = SIGBUS;
        info.si_errno = 0;
        info.si_code = BUS_ADRALN;
index e8c3cb6b6d08ccbfb04ccd09f55da90db70cfbea..00f6353fe4350b2014b9ee9f1421fff543694bcb 100644 (file)
@@ -152,6 +152,7 @@ sparc_breakpoint (struct pt_regs *regs)
 #ifdef DEBUG_SPARC_BREAKPOINT
         printk ("TRAP: Entering kernel PC=%x, nPC=%x\n", regs->pc, regs->npc);
 #endif
+       clear_siginfo(&info);
        info.si_signo = SIGTRAP;
        info.si_errno = 0;
        info.si_code = TRAP_BRKPT;
index 33cd35bf3dc8b6ce8148e5bd3f2fdb8c7b15b721..03e522274b8b5ec1ab1b1a49afef5c8d854f118f 100644 (file)
@@ -104,6 +104,7 @@ void do_hw_interrupt(struct pt_regs *regs, unsigned long type)
        if(regs->psr & PSR_PS)
                die_if_kernel("Kernel bad trap", regs);
 
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code = ILL_ILLTRP;
@@ -124,6 +125,7 @@ void do_illegal_instruction(struct pt_regs *regs, unsigned long pc, unsigned lon
               regs->pc, *(unsigned long *)regs->pc);
 #endif
 
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code = ILL_ILLOPC;
@@ -139,6 +141,7 @@ void do_priv_instruction(struct pt_regs *regs, unsigned long pc, unsigned long n
 
        if(psr & PSR_PS)
                die_if_kernel("Penguin instruction from Penguin mode??!?!", regs);
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code = ILL_PRVOPC;
@@ -165,6 +168,7 @@ void do_memaccess_unaligned(struct pt_regs *regs, unsigned long pc, unsigned lon
        instruction_dump ((unsigned long *) regs->pc);
        printk ("do_MNA!\n");
 #endif
+       clear_siginfo(&info);
        info.si_signo = SIGBUS;
        info.si_errno = 0;
        info.si_code = BUS_ADRALN;
@@ -303,6 +307,7 @@ void do_fpe_trap(struct pt_regs *regs, unsigned long pc, unsigned long npc,
        }
 
        fsr = fpt->thread.fsr;
+       clear_siginfo(&info);
        info.si_signo = SIGFPE;
        info.si_errno = 0;
        info.si_addr = (void __user *)pc;
@@ -336,6 +341,7 @@ void handle_tag_overflow(struct pt_regs *regs, unsigned long pc, unsigned long n
 
        if(psr & PSR_PS)
                die_if_kernel("Penguin overflow trap from kernel mode", regs);
+       clear_siginfo(&info);
        info.si_signo = SIGEMT;
        info.si_errno = 0;
        info.si_code = EMT_TAGOVF;
@@ -365,6 +371,7 @@ void handle_reg_access(struct pt_regs *regs, unsigned long pc, unsigned long npc
        printk("Register Access Exception at PC %08lx NPC %08lx PSR %08lx\n",
               pc, npc, psr);
 #endif
+       clear_siginfo(&info);
        info.si_signo = SIGBUS;
        info.si_errno = 0;
        info.si_code = BUS_OBJERR;
@@ -378,6 +385,7 @@ void handle_cp_disabled(struct pt_regs *regs, unsigned long pc, unsigned long np
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code = ILL_COPROC;
@@ -395,6 +403,7 @@ void handle_cp_exception(struct pt_regs *regs, unsigned long pc, unsigned long n
        printk("Co-Processor Exception at PC %08lx NPC %08lx PSR %08lx\n",
               pc, npc, psr);
 #endif
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code = ILL_COPROC;
@@ -408,6 +417,7 @@ void handle_hw_divzero(struct pt_regs *regs, unsigned long pc, unsigned long npc
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo = SIGFPE;
        info.si_errno = 0;
        info.si_code = FPE_INTDIV;
index e81072ac52c376743af12c50ce23c8c8d5e54c3b..b485b49b87a8e8bf67adde7bfe569b84d3e5fff0 100644 (file)
@@ -107,6 +107,7 @@ void bad_trap(struct pt_regs *regs, long lvl)
                regs->tpc &= 0xffffffff;
                regs->tnpc &= 0xffffffff;
        }
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code = ILL_ILLTRP;
@@ -206,6 +207,7 @@ void spitfire_insn_access_exception(struct pt_regs *regs, unsigned long sfsr, un
                regs->tpc &= 0xffffffff;
                regs->tnpc &= 0xffffffff;
        }
+       clear_siginfo(&info);
        info.si_signo = SIGSEGV;
        info.si_errno = 0;
        info.si_code = SEGV_MAPERR;
@@ -247,6 +249,7 @@ void sun4v_insn_access_exception(struct pt_regs *regs, unsigned long addr, unsig
                regs->tpc &= 0xffffffff;
                regs->tnpc &= 0xffffffff;
        }
+       clear_siginfo(&info);
        info.si_signo = SIGSEGV;
        info.si_errno = 0;
        info.si_code = SEGV_MAPERR;
@@ -338,6 +341,7 @@ void spitfire_data_access_exception(struct pt_regs *regs, unsigned long sfsr, un
        if (is_no_fault_exception(regs))
                return;
 
+       clear_siginfo(&info);
        info.si_signo = SIGSEGV;
        info.si_errno = 0;
        info.si_code = SEGV_MAPERR;
@@ -595,6 +599,7 @@ static void spitfire_ue_log(unsigned long afsr, unsigned long afar, unsigned lon
                regs->tpc &= 0xffffffff;
                regs->tnpc &= 0xffffffff;
        }
+       clear_siginfo(&info);
        info.si_signo = SIGBUS;
        info.si_errno = 0;
        info.si_code = BUS_OBJERR;
@@ -2211,6 +2216,7 @@ bool sun4v_nonresum_error_user_handled(struct pt_regs *regs,
                                addr += PAGE_SIZE;
                        }
                }
+               clear_siginfo(&info);
                info.si_signo = SIGKILL;
                info.si_errno = 0;
                info.si_trapno = 0;
@@ -2221,6 +2227,7 @@ bool sun4v_nonresum_error_user_handled(struct pt_regs *regs,
        if (attrs & SUN4V_ERR_ATTRS_PIO) {
                siginfo_t info;
 
+               clear_siginfo(&info);
                info.si_signo = SIGBUS;
                info.si_code = BUS_ADRERR;
                info.si_addr = (void __user *)sun4v_get_vaddr(regs);
@@ -2368,6 +2375,7 @@ static void do_fpe_common(struct pt_regs *regs)
                        regs->tpc &= 0xffffffff;
                        regs->tnpc &= 0xffffffff;
                }
+               clear_siginfo(&info);
                info.si_signo = SIGFPE;
                info.si_errno = 0;
                info.si_addr = (void __user *)regs->tpc;
@@ -2440,6 +2448,7 @@ void do_tof(struct pt_regs *regs)
                regs->tpc &= 0xffffffff;
                regs->tnpc &= 0xffffffff;
        }
+       clear_siginfo(&info);
        info.si_signo = SIGEMT;
        info.si_errno = 0;
        info.si_code = EMT_TAGOVF;
@@ -2465,6 +2474,7 @@ void do_div0(struct pt_regs *regs)
                regs->tpc &= 0xffffffff;
                regs->tnpc &= 0xffffffff;
        }
+       clear_siginfo(&info);
        info.si_signo = SIGFPE;
        info.si_errno = 0;
        info.si_code = FPE_INTDIV;
@@ -2666,6 +2676,7 @@ void do_illegal_instruction(struct pt_regs *regs)
                        }
                }
        }
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code = ILL_ILLOPC;
@@ -2692,6 +2703,7 @@ void mem_address_unaligned(struct pt_regs *regs, unsigned long sfar, unsigned lo
        if (is_no_fault_exception(regs))
                return;
 
+       clear_siginfo(&info);
        info.si_signo = SIGBUS;
        info.si_errno = 0;
        info.si_code = BUS_ADRALN;
@@ -2717,6 +2729,7 @@ void sun4v_do_mna(struct pt_regs *regs, unsigned long addr, unsigned long type_c
        if (is_no_fault_exception(regs))
                return;
 
+       clear_siginfo(&info);
        info.si_signo = SIGBUS;
        info.si_errno = 0;
        info.si_code = BUS_ADRALN;
@@ -2785,6 +2798,7 @@ void do_privop(struct pt_regs *regs)
                regs->tpc &= 0xffffffff;
                regs->tnpc &= 0xffffffff;
        }
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code = ILL_PRVOPC;
index 7642d7e4f0d9e0b8440cc23ed3af54ece843c0e3..0e4cf721741385fb1df402fdb9ec57a965980e7c 100644 (file)
@@ -313,6 +313,7 @@ static void user_mna_trap_fault(struct pt_regs *regs, unsigned int insn)
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo = SIGBUS;
        info.si_errno = 0;
        info.si_code = BUS_ADRALN;
index a8103a84b4ac4a2ec84c44c302862b3aed8b7e7f..2deb586665b96ef0f1451f9bb57a6a3c79bd625c 100644 (file)
@@ -129,6 +129,7 @@ static void __do_fault_siginfo(int code, int sig, struct pt_regs *regs,
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo = sig;
        info.si_code = code;
        info.si_errno = 0;
index 41363f46797bf9f74dd922fadbd2a3f190e8c9bb..46ccff95d10e16c084b0e302cabe47206f186d69 100644 (file)
@@ -172,6 +172,7 @@ static void do_fault_siginfo(int code, int sig, struct pt_regs *regs,
        unsigned long addr;
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_code = code;
        info.si_signo = sig;
        info.si_errno = 0;
index b2b02df9896ee8ba629494bd4fa1c7551b26b178..d4d38520c4c6131cc6aba06a5274ec6f8e69222b 100644 (file)
@@ -164,6 +164,7 @@ static void bad_segv(struct faultinfo fi, unsigned long ip)
 {
        struct siginfo si;
 
+       clear_siginfo(&si);
        si.si_signo = SIGSEGV;
        si.si_code = SEGV_ACCERR;
        si.si_addr = (void __user *) FAULT_ADDRESS(fi);
@@ -220,6 +221,7 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user,
        int is_write = FAULT_WRITE(fi);
        unsigned long address = FAULT_ADDRESS(fi);
 
+       clear_siginfo(&si);
        if (!is_user && regs)
                current->thread.segv_regs = container_of(regs, struct pt_regs, regs);
 
index 12c8c9527b8e83411391faa1249ddd031d2111d4..d785955e1c2932ee5890f45c483ca95486c00561 100644 (file)
@@ -56,7 +56,7 @@ void ucf64_raise_sigfpe(unsigned int sicode, struct pt_regs *regs)
 {
        siginfo_t info;
 
-       memset(&info, 0, sizeof(info));
+       clear_siginfo(&info);
 
        info.si_signo = SIGFPE;
        info.si_code = sicode;
index bbefcc46a45e4187599118b8af70984a81c7760f..3814734129378eda8edf49148e83df9a5da81c9b 100644 (file)
@@ -125,6 +125,7 @@ static void __do_user_fault(struct task_struct *tsk, unsigned long addr,
        tsk->thread.address = addr;
        tsk->thread.error_code = fsr;
        tsk->thread.trap_no = 14;
+       clear_siginfo(&si);
        si.si_signo = sig;
        si.si_errno = 0;
        si.si_code = code;
@@ -472,6 +473,7 @@ asmlinkage void do_DataAbort(unsigned long addr, unsigned int fsr,
        printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n",
               inf->name, fsr, addr);
 
+       clear_siginfo(&info);
        info.si_signo = inf->sig;
        info.si_errno = 0;
        info.si_code = inf->code;
@@ -491,6 +493,7 @@ asmlinkage void do_PrefetchAbort(unsigned long addr,
        printk(KERN_ALERT "Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n",
               inf->name, ifsr, addr);
 
+       clear_siginfo(&info);
        info.si_signo = inf->sig;
        info.si_errno = 0;
        info.si_code = inf->code;
index 70b7845434cb06f30fda9feec4f2a35c90838bd8..7782cdbcd67d94e025b740e362f2a4e64e575887 100644 (file)
@@ -107,7 +107,7 @@ static bool write_ok_or_segv(unsigned long ptr, size_t size)
                thread->cr2             = ptr;
                thread->trap_nr         = X86_TRAP_PF;
 
-               memset(&info, 0, sizeof(info));
+               clear_siginfo(&info);
                info.si_signo           = SIGSEGV;
                info.si_errno           = 0;
                info.si_code            = SEGV_MAPERR;
index ed5c4cdf0a348d6a0de34d1214298f12fd6f1ddb..e2ee403865ebee6e265cfa3f35f5f0fad78436fe 100644 (file)
@@ -1377,7 +1377,6 @@ static void fill_sigtrap_info(struct task_struct *tsk,
        tsk->thread.trap_nr = X86_TRAP_DB;
        tsk->thread.error_code = error_code;
 
-       memset(info, 0, sizeof(*info));
        info->si_signo = SIGTRAP;
        info->si_code = si_code;
        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,
 {
        struct siginfo info;
 
+       clear_siginfo(&info);
        fill_sigtrap_info(tsk, regs, error_code, si_code, &info);
        /* Send us the fake SIGTRAP */
        force_sig_info(SIGTRAP, &info, tsk);
index 03f3d7695daccae1af7265f2aab221da81573ce5..a535dd64de6397b02b3f53cd685584ebf7ebf445 100644 (file)
@@ -299,6 +299,7 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
        if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
                        NOTIFY_STOP) {
                cond_local_irq_enable(regs);
+               clear_siginfo(&info);
                do_trap(trapnr, signr, str, regs, error_code,
                        fill_trap_info(regs, signr, trapnr, &info));
        }
@@ -854,6 +855,7 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr)
 
        task->thread.trap_nr    = trapnr;
        task->thread.error_code = error_code;
+       clear_siginfo(&info);
        info.si_signo           = SIGFPE;
        info.si_errno           = 0;
        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)
        RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
        local_irq_enable();
 
+       clear_siginfo(&info);
        info.si_signo = SIGILL;
        info.si_errno = 0;
        info.si_code = ILL_BADSTK;
index f44ce0fb35832aa0cfd7619fff7ad27b1742540e..ff20b35e98dddb84249ec2ddbba1ecf6d345004e 100644 (file)
@@ -278,6 +278,7 @@ static void force_sig_info_umip_fault(void __user *addr, struct pt_regs *regs)
        tsk->thread.error_code  = X86_PF_USER | X86_PF_WRITE;
        tsk->thread.trap_nr     = X86_TRAP_PF;
 
+       clear_siginfo(&info);
        info.si_signo   = SIGSEGV;
        info.si_errno   = 0;
        info.si_code    = SEGV_MAPERR;
index 8494dbae41b9e58d8be0ec4d8ef2f98439e8d3fd..d634f0332c0fad5aec8b7e285b97d7423e064dcc 100644 (file)
@@ -3007,6 +3007,7 @@ static void kvm_send_hwpoison_signal(unsigned long address, struct task_struct *
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo   = SIGBUS;
        info.si_errno   = 0;
        info.si_code    = BUS_MCEERR_AR;
index 73bd8c95ac711d69e551094f15b4534208ea3705..2a5a2920203dfdf43a42d32ecd72a96013c8aebc 100644 (file)
@@ -209,6 +209,7 @@ force_sig_info_fault(int si_signo, int si_code, unsigned long address,
        unsigned lsb = 0;
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo   = si_signo;
        info.si_errno   = 0;
        info.si_code    = si_code;
index 32c5207f12269bcd7b10fb8057e169bf13f8b1ba..51771929f341416968aa56f1b523ef8bd9a40a78 100644 (file)
@@ -334,6 +334,7 @@ do_unaligned_user (struct pt_regs *regs)
                            "(pid = %d, pc = %#010lx)\n",
                            regs->excvaddr, current->comm,
                            task_pid_nr(current), regs->pc);
+       clear_siginfo(&info);
        info.si_signo = SIGBUS;
        info.si_errno = 0;
        info.si_code = BUS_ADRALN;
index 8b9b6f44bb06093199da82d6c8ec34cab12e8c27..f9323a3e61ce47c39741d0215a94917aec0cfd32 100644 (file)
@@ -45,6 +45,7 @@ void do_page_fault(struct pt_regs *regs)
        int fault;
        unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
 
+       clear_siginfo(&info);
        info.si_code = SEGV_MAPERR;
 
        /* We fault-in kernel-space virtual memory on-demand. The
index 919b2a0b0307482016c317399a906af75a703770..037bf0ef1ae94ffddd23906901c82fa362582cbf 100644 (file)
@@ -345,7 +345,6 @@ extern void user_single_step_siginfo(struct task_struct *tsk,
 static inline void user_single_step_siginfo(struct task_struct *tsk,
                                struct pt_regs *regs, siginfo_t *info)
 {
-       memset(info, 0, sizeof(*info));
        info->si_signo = SIGTRAP;
 }
 #endif
index 26c152122a424dc337764357db5bb297a40074fd..4a8841963c2ee73a8529e049a594cba437636109 100644 (file)
@@ -124,6 +124,7 @@ static inline void tracehook_report_syscall_exit(struct pt_regs *regs, int step)
 {
        if (step) {
                siginfo_t info;
+               clear_siginfo(&info);
                user_single_step_siginfo(current, regs, &info);
                force_sig_info(SIGTRAP, &info, current);
                return;
index 7f6a944db23d6c471d87e0d58effc4c0d1ac01a4..8d90de213ce9b89340b7dc11927862f8344829c7 100644 (file)
@@ -1401,6 +1401,7 @@ static void kvm_send_hwpoison_signal(unsigned long address,
 {
        siginfo_t info;
 
+       clear_siginfo(&info);
        info.si_signo   = SIGBUS;
        info.si_errno   = 0;
        info.si_code    = BUS_MCEERR_AR;