mirror of https://gitee.com/openkylin/linux.git
powerpc/signal: Use __get_user() to copy sigset_t
Usually sigset_t is exactly 8B which is a "trivial" size and does not warrant using __copy_from_user(). Use __get_user() directly in anticipation of future work to remove the trivial size optimizations from __copy_from_user(). The ppc32 implementation of get_sigset_t() previously called copy_from_user() which, unlike __copy_from_user(), calls access_ok(). Replacing this w/ __get_user() (no access_ok()) is fine here since both callsites in signal_32.c are preceded by an earlier access_ok(). Signed-off-by: Christopher M. Riedl <cmr@codefail.de> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20210227011259.11992-11-cmr@codefail.de
This commit is contained in:
parent
0f92433b8f
commit
d3ccc97815
|
@ -19,6 +19,13 @@ extern int handle_signal32(struct ksignal *ksig, sigset_t *oldset,
|
||||||
extern int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,
|
extern int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,
|
||||||
struct task_struct *tsk);
|
struct task_struct *tsk);
|
||||||
|
|
||||||
|
static inline int __get_user_sigset(sigset_t *dst, const sigset_t __user *src)
|
||||||
|
{
|
||||||
|
BUILD_BUG_ON(sizeof(sigset_t) != sizeof(u64));
|
||||||
|
|
||||||
|
return __get_user(dst->sig[0], (u64 __user *)&src->sig[0]);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_VSX
|
#ifdef CONFIG_VSX
|
||||||
extern unsigned long copy_vsx_to_user(void __user *to,
|
extern unsigned long copy_vsx_to_user(void __user *to,
|
||||||
struct task_struct *task);
|
struct task_struct *task);
|
||||||
|
|
|
@ -144,7 +144,7 @@ static inline int restore_general_regs(struct pt_regs *regs,
|
||||||
|
|
||||||
static inline int get_sigset_t(sigset_t *set, const sigset_t __user *uset)
|
static inline int get_sigset_t(sigset_t *set, const sigset_t __user *uset)
|
||||||
{
|
{
|
||||||
return copy_from_user(set, uset, sizeof(*uset));
|
return __get_user_sigset(set, uset);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define to_user_ptr(p) ((unsigned long)(p))
|
#define to_user_ptr(p) ((unsigned long)(p))
|
||||||
|
|
|
@ -708,7 +708,7 @@ SYSCALL_DEFINE3(swapcontext, struct ucontext __user *, old_ctx,
|
||||||
* We kill the task with a SIGSEGV in this situation.
|
* We kill the task with a SIGSEGV in this situation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (__copy_from_user(&set, &new_ctx->uc_sigmask, sizeof(set)))
|
if (__get_user_sigset(&set, &new_ctx->uc_sigmask))
|
||||||
do_exit(SIGSEGV);
|
do_exit(SIGSEGV);
|
||||||
set_current_blocked(&set);
|
set_current_blocked(&set);
|
||||||
|
|
||||||
|
@ -747,7 +747,7 @@ SYSCALL_DEFINE0(rt_sigreturn)
|
||||||
if (!access_ok(uc, sizeof(*uc)))
|
if (!access_ok(uc, sizeof(*uc)))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
|
|
||||||
if (__copy_from_user(&set, &uc->uc_sigmask, sizeof(set)))
|
if (__get_user_sigset(&set, &uc->uc_sigmask))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
set_current_blocked(&set);
|
set_current_blocked(&set);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue