]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
um: fix SECCOMP 32bit xstate register restore
authorBenjamin Berg <benjamin.berg@intel.com>
Wed, 4 Jun 2025 08:17:05 +0000 (10:17 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 4 Jun 2025 09:40:36 +0000 (11:40 +0200)
There was a typo that caused the extended FP state to be copied into the
wrong location on 32 bit. On 32 bit we only store the xstate internally
as that already contains everything. However, for compatibility, the
mcontext on 32 bit first contains the legacy FP state and then the
xstate.

The code copied the xstate on top of the legacy FP state instead of
using the correct offset. This offset was already calculated in the
xstate_* variables, so simply switch to those to fix the problem.

With this SECCOMP mode works on 32 bit, so lift the restriction.

Fixes: b1e1bd2e6943 ("um: Add helper functions to get/set state for SECCOMP")
Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Link: https://patch.msgid.link/20250604081705.934112-1-benjamin@sipsolutions.net
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
arch/um/os-Linux/start_up.c
arch/x86/um/os-Linux/mcontext.c

index 49015be1aaaf4b1f67920b56d6cb4710d0f3854b..a827c2e01aa53a5ad927d92bd2cd1c19ead67dd2 100644 (file)
@@ -296,10 +296,6 @@ static bool __init init_seccomp(void)
        int n;
        unsigned long sp;
 
-       /* doesn't work on 32-bit right now */
-       if (!IS_ENABLED(CONFIG_64BIT))
-               return false;
-
        /*
         * We check that we can install a seccomp filter and then exit(0)
         * from a trapped syscall.
index e661fdc44db93c675e9732262f0dea4e71f3a463..a21403df66637b8c42111529945714f7dbe32209 100644 (file)
@@ -231,7 +231,7 @@ int set_stub_state(struct uml_pt_regs *regs, struct stub_data *data,
        xstate_size = fp_size;
 #endif
 
-       memcpy(fpstate_stub, &regs->fp, fp_size);
+       memcpy(xstate_stub, &regs->fp, xstate_size);
 
 #ifdef __i386__
        /*