x86/signal: Remove sigset_t parameter from frame setup functions
authorBrian Gerst <brgerst@gmail.com>
Mon, 6 Jun 2022 20:37:56 +0000 (16:37 -0400)
committerBorislav Petkov <bp@suse.de>
Wed, 19 Oct 2022 07:58:48 +0000 (09:58 +0200)
Push down the call to sigmask_to_save() into the frame setup functions.
Thus, remove the use of compat_sigset_t outside of the compat code.

Signed-off-by: Brian Gerst <brgerst@gmail.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Acked-by: "Eric W. Biederman" <ebiederm@xmission.com>
Link: https://lore.kernel.org/r/20220606203802.158958-3-brgerst@gmail.com
Signed-off-by: Borislav Petkov <bp@suse.de>
arch/x86/ia32/ia32_signal.c
arch/x86/include/asm/fpu/signal.h
arch/x86/include/asm/signal.h
arch/x86/kernel/signal.c

index 390347ab92de46adee4daa0253608c9130e0f962..b67e27685d46a7ba5430c91e64b1ac0c6f7455ee 100644 (file)
@@ -230,9 +230,9 @@ static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,
        return (void __user *) sp;
 }
 
-int ia32_setup_frame(struct ksignal *ksig,
-                    compat_sigset_t *set, struct pt_regs *regs)
+int ia32_setup_frame(struct ksignal *ksig, struct pt_regs *regs)
 {
+       compat_sigset_t *set = (compat_sigset_t *) sigmask_to_save();
        struct sigframe_ia32 __user *frame;
        void __user *restorer;
        void __user *fp = NULL;
@@ -296,9 +296,9 @@ Efault:
        return -EFAULT;
 }
 
-int ia32_setup_rt_frame(struct ksignal *ksig,
-                       compat_sigset_t *set, struct pt_regs *regs)
+int ia32_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
 {
+       compat_sigset_t *set = (compat_sigset_t *) sigmask_to_save();
        struct rt_sigframe_ia32 __user *frame;
        void __user *restorer;
        void __user *fp = NULL;
index 08826ad0254dc6d1577412896dca75d0da376727..2f255aca5622ff596913d7fb48ca34a43eb19315 100644 (file)
 # include <uapi/asm/sigcontext.h>
 # include <asm/user32.h>
 struct ksignal;
-int ia32_setup_rt_frame(struct ksignal *ksig,
-                       compat_sigset_t *set, struct pt_regs *regs);
-int ia32_setup_frame(struct ksignal *ksig,
-                    compat_sigset_t *set, struct pt_regs *regs);
+int ia32_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs);
+int ia32_setup_frame(struct ksignal *ksig, struct pt_regs *regs);
 #else
 # define user_i387_ia32_struct user_i387_struct
 # define user32_fxsr_struct    user_fxsr_struct
index 2dfb5fea13aff499efd547cf6df68a848e14c4f5..4a4043ca64934acc32761f7ef1d15313190ff9f4 100644 (file)
@@ -28,11 +28,6 @@ typedef struct {
 #define SA_IA32_ABI    0x02000000u
 #define SA_X32_ABI     0x01000000u
 
-#ifndef CONFIG_COMPAT
-#define compat_sigset_t compat_sigset_t
-typedef sigset_t compat_sigset_t;
-#endif
-
 #endif /* __ASSEMBLY__ */
 #include <uapi/asm/signal.h>
 #ifndef __ASSEMBLY__
index 40b1373bb70bc40af2233c15c659e5c2871cf270..489a0859afd22f313f723c516eff9cc5017f740f 100644 (file)
@@ -324,9 +324,9 @@ static const struct {
 };
 
 static int
-__setup_frame(struct ksignal *ksig, sigset_t *set,
-             struct pt_regs *regs)
+__setup_frame(struct ksignal *ksig, struct pt_regs *regs)
 {
+       sigset_t *set = sigmask_to_save();
        struct sigframe __user *frame;
        void __user *restorer;
        void __user *fp = NULL;
@@ -379,9 +379,9 @@ Efault:
        return -EFAULT;
 }
 
-static int __setup_rt_frame(struct ksignal *ksig,
-                           sigset_t *set, struct pt_regs *regs)
+static int __setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
 {
+       sigset_t *set = sigmask_to_save();
        struct rt_sigframe __user *frame;
        void __user *restorer;
        void __user *fp = NULL;
@@ -458,9 +458,9 @@ static unsigned long frame_uc_flags(struct pt_regs *regs)
        return flags;
 }
 
-static int __setup_rt_frame(struct ksignal *ksig,
-                           sigset_t *set, struct pt_regs *regs)
+static int __setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
 {
+       sigset_t *set = sigmask_to_save();
        struct rt_sigframe __user *frame;
        void __user *fp = NULL;
        unsigned long uc_flags;
@@ -560,11 +560,10 @@ int copy_siginfo_to_user32(struct compat_siginfo __user *to,
 }
 #endif /* CONFIG_X86_X32_ABI */
 
-static int x32_setup_rt_frame(struct ksignal *ksig,
-                             compat_sigset_t *set,
-                             struct pt_regs *regs)
+static int x32_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
 {
 #ifdef CONFIG_X86_X32_ABI
+       compat_sigset_t *set = (compat_sigset_t *) sigmask_to_save();
        struct rt_sigframe_x32 __user *frame;
        unsigned long uc_flags;
        void __user *restorer;
@@ -763,22 +762,19 @@ static inline int is_x32_frame(struct ksignal *ksig)
 static int
 setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
 {
-       sigset_t *set = sigmask_to_save();
-       compat_sigset_t *cset = (compat_sigset_t *) set;
-
        /* Perform fixup for the pre-signal frame. */
        rseq_signal_deliver(ksig, regs);
 
        /* Set up the stack frame */
        if (is_ia32_frame(ksig)) {
                if (ksig->ka.sa.sa_flags & SA_SIGINFO)
-                       return ia32_setup_rt_frame(ksig, cset, regs);
+                       return ia32_setup_rt_frame(ksig, regs);
                else
-                       return ia32_setup_frame(ksig, cset, regs);
+                       return ia32_setup_frame(ksig, regs);
        } else if (is_x32_frame(ksig)) {
-               return x32_setup_rt_frame(ksig, cset, regs);
+               return x32_setup_rt_frame(ksig, regs);
        } else {
-               return __setup_rt_frame(ksig, set, regs);
+               return __setup_rt_frame(ksig, regs);
        }
 }