mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
Merge branch 'for-v5.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
Pull siginfo fix from Eric Biederman: "During the merge window an issue with si_perf and the siginfo ABI came up. The alpha and sparc siginfo structure layout had changed with the addition of SIGTRAP TRAP_PERF and the new field si_perf. The reason only alpha and sparc were affected is that they are the only architectures that use si_trapno. Looking deeper it was discovered that si_trapno is used for only a few select signals on alpha and sparc, and that none of the other _sigfault fields past si_addr are used at all. Which means technically no regression on alpha and sparc. While the alignment concerns might be dismissed the abuse of si_errno by SIGTRAP TRAP_PERF does have the potential to cause regressions in existing userspace. While we still have time before userspace starts using and depending on the new definition siginfo for SIGTRAP TRAP_PERF this set of changes cleans up siginfo_t. - The si_trapno field is demoted from magic alpha and sparc status and made an ordinary union member of the _sigfault member of siginfo_t. Without moving it of course. - si_perf is replaced with si_perf_data and si_perf_type ending the abuse of si_errno. - Unnecessary additions to signalfd_siginfo are removed" * 'for-v5.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace: signalfd: Remove SIL_PERF_EVENT fields from signalfd_siginfo signal: Deliver all of the siginfo perf data in _perf signal: Factor force_sig_perf out of perf_sigtrap signal: Implement SIL_FAULT_TRAPNO siginfo: Move si_trapno inside the union inside _si_fault
This commit is contained in:
@@ -1236,6 +1236,7 @@ static inline bool has_si_pid_and_uid(struct kernel_siginfo *info)
|
||||
case SIL_TIMER:
|
||||
case SIL_POLL:
|
||||
case SIL_FAULT:
|
||||
case SIL_FAULT_TRAPNO:
|
||||
case SIL_FAULT_MCEERR:
|
||||
case SIL_FAULT_BNDERR:
|
||||
case SIL_FAULT_PKUERR:
|
||||
@@ -1804,6 +1805,21 @@ int force_sig_pkuerr(void __user *addr, u32 pkey)
|
||||
}
|
||||
#endif
|
||||
|
||||
int force_sig_perf(void __user *addr, u32 type, u64 sig_data)
|
||||
{
|
||||
struct kernel_siginfo info;
|
||||
|
||||
clear_siginfo(&info);
|
||||
info.si_signo = SIGTRAP;
|
||||
info.si_errno = 0;
|
||||
info.si_code = TRAP_PERF;
|
||||
info.si_addr = addr;
|
||||
info.si_perf_data = sig_data;
|
||||
info.si_perf_type = type;
|
||||
|
||||
return force_sig_info(&info);
|
||||
}
|
||||
|
||||
/* For the crazy architectures that include trap information in
|
||||
* the errno field, instead of an actual errno value.
|
||||
*/
|
||||
@@ -2564,6 +2580,7 @@ static void hide_si_addr_tag_bits(struct ksignal *ksig)
|
||||
{
|
||||
switch (siginfo_layout(ksig->sig, ksig->info.si_code)) {
|
||||
case SIL_FAULT:
|
||||
case SIL_FAULT_TRAPNO:
|
||||
case SIL_FAULT_MCEERR:
|
||||
case SIL_FAULT_BNDERR:
|
||||
case SIL_FAULT_PKUERR:
|
||||
@@ -3251,6 +3268,10 @@ enum siginfo_layout siginfo_layout(unsigned sig, int si_code)
|
||||
#endif
|
||||
else if ((sig == SIGTRAP) && (si_code == TRAP_PERF))
|
||||
layout = SIL_PERF_EVENT;
|
||||
#ifdef __ARCH_SI_TRAPNO
|
||||
else if (layout == SIL_FAULT)
|
||||
layout = SIL_FAULT_TRAPNO;
|
||||
#endif
|
||||
}
|
||||
else if (si_code <= NSIGPOLL)
|
||||
layout = SIL_POLL;
|
||||
@@ -3354,35 +3375,28 @@ void copy_siginfo_to_external32(struct compat_siginfo *to,
|
||||
break;
|
||||
case SIL_FAULT:
|
||||
to->si_addr = ptr_to_compat(from->si_addr);
|
||||
#ifdef __ARCH_SI_TRAPNO
|
||||
break;
|
||||
case SIL_FAULT_TRAPNO:
|
||||
to->si_addr = ptr_to_compat(from->si_addr);
|
||||
to->si_trapno = from->si_trapno;
|
||||
#endif
|
||||
break;
|
||||
case SIL_FAULT_MCEERR:
|
||||
to->si_addr = ptr_to_compat(from->si_addr);
|
||||
#ifdef __ARCH_SI_TRAPNO
|
||||
to->si_trapno = from->si_trapno;
|
||||
#endif
|
||||
to->si_addr_lsb = from->si_addr_lsb;
|
||||
break;
|
||||
case SIL_FAULT_BNDERR:
|
||||
to->si_addr = ptr_to_compat(from->si_addr);
|
||||
#ifdef __ARCH_SI_TRAPNO
|
||||
to->si_trapno = from->si_trapno;
|
||||
#endif
|
||||
to->si_lower = ptr_to_compat(from->si_lower);
|
||||
to->si_upper = ptr_to_compat(from->si_upper);
|
||||
break;
|
||||
case SIL_FAULT_PKUERR:
|
||||
to->si_addr = ptr_to_compat(from->si_addr);
|
||||
#ifdef __ARCH_SI_TRAPNO
|
||||
to->si_trapno = from->si_trapno;
|
||||
#endif
|
||||
to->si_pkey = from->si_pkey;
|
||||
break;
|
||||
case SIL_PERF_EVENT:
|
||||
to->si_addr = ptr_to_compat(from->si_addr);
|
||||
to->si_perf = from->si_perf;
|
||||
to->si_perf_data = from->si_perf_data;
|
||||
to->si_perf_type = from->si_perf_type;
|
||||
break;
|
||||
case SIL_CHLD:
|
||||
to->si_pid = from->si_pid;
|
||||
@@ -3438,35 +3452,28 @@ static int post_copy_siginfo_from_user32(kernel_siginfo_t *to,
|
||||
break;
|
||||
case SIL_FAULT:
|
||||
to->si_addr = compat_ptr(from->si_addr);
|
||||
#ifdef __ARCH_SI_TRAPNO
|
||||
break;
|
||||
case SIL_FAULT_TRAPNO:
|
||||
to->si_addr = compat_ptr(from->si_addr);
|
||||
to->si_trapno = from->si_trapno;
|
||||
#endif
|
||||
break;
|
||||
case SIL_FAULT_MCEERR:
|
||||
to->si_addr = compat_ptr(from->si_addr);
|
||||
#ifdef __ARCH_SI_TRAPNO
|
||||
to->si_trapno = from->si_trapno;
|
||||
#endif
|
||||
to->si_addr_lsb = from->si_addr_lsb;
|
||||
break;
|
||||
case SIL_FAULT_BNDERR:
|
||||
to->si_addr = compat_ptr(from->si_addr);
|
||||
#ifdef __ARCH_SI_TRAPNO
|
||||
to->si_trapno = from->si_trapno;
|
||||
#endif
|
||||
to->si_lower = compat_ptr(from->si_lower);
|
||||
to->si_upper = compat_ptr(from->si_upper);
|
||||
break;
|
||||
case SIL_FAULT_PKUERR:
|
||||
to->si_addr = compat_ptr(from->si_addr);
|
||||
#ifdef __ARCH_SI_TRAPNO
|
||||
to->si_trapno = from->si_trapno;
|
||||
#endif
|
||||
to->si_pkey = from->si_pkey;
|
||||
break;
|
||||
case SIL_PERF_EVENT:
|
||||
to->si_addr = compat_ptr(from->si_addr);
|
||||
to->si_perf = from->si_perf;
|
||||
to->si_perf_data = from->si_perf_data;
|
||||
to->si_perf_type = from->si_perf_type;
|
||||
break;
|
||||
case SIL_CHLD:
|
||||
to->si_pid = from->si_pid;
|
||||
@@ -4644,11 +4651,13 @@ static inline void siginfo_buildtime_checks(void)
|
||||
|
||||
/* sigfault */
|
||||
CHECK_OFFSET(si_addr);
|
||||
CHECK_OFFSET(si_trapno);
|
||||
CHECK_OFFSET(si_addr_lsb);
|
||||
CHECK_OFFSET(si_lower);
|
||||
CHECK_OFFSET(si_upper);
|
||||
CHECK_OFFSET(si_pkey);
|
||||
CHECK_OFFSET(si_perf);
|
||||
CHECK_OFFSET(si_perf_data);
|
||||
CHECK_OFFSET(si_perf_type);
|
||||
|
||||
/* sigpoll */
|
||||
CHECK_OFFSET(si_band);
|
||||
|
Reference in New Issue
Block a user