|
@@ -2748,12 +2748,15 @@ int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from)
|
|
|
* Other callers might not initialize the si_lsb field,
|
|
|
* so check explicitly for the right codes here.
|
|
|
*/
|
|
|
- if (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO)
|
|
|
+ if (from->si_signo == SIGBUS &&
|
|
|
+ (from->si_code == BUS_MCEERR_AR || from->si_code == BUS_MCEERR_AO))
|
|
|
err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb);
|
|
|
#endif
|
|
|
#ifdef SEGV_BNDERR
|
|
|
- err |= __put_user(from->si_lower, &to->si_lower);
|
|
|
- err |= __put_user(from->si_upper, &to->si_upper);
|
|
|
+ if (from->si_signo == SIGSEGV && from->si_code == SEGV_BNDERR) {
|
|
|
+ err |= __put_user(from->si_lower, &to->si_lower);
|
|
|
+ err |= __put_user(from->si_upper, &to->si_upper);
|
|
|
+ }
|
|
|
#endif
|
|
|
break;
|
|
|
case __SI_CHLD:
|