]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
rseq: Set rseq::cpu_id_start to 0 on unregistration
authorThomas Gleixner <tglx@kernel.org>
Tue, 28 Apr 2026 08:10:19 +0000 (10:10 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Fri, 1 May 2026 19:32:20 +0000 (21:32 +0200)
The RSEQ rework changed that to RSEQ_CPU_UNINITILIZED, which is obviously
incompatible. Revert back to the original behavior.

Fixes: 0f085b41880e ("rseq: Provide and use rseq_set_ids()")
Reported-by: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
Tested-by: Dmitry Vyukov <dvyukov@google.com>
Link: https://patch.msgid.link/20260428224427.271566313%40kernel.org
Cc: stable@vger.kernel.org
kernel/rseq.c

index 38d3ef540760f4379977def7e74327a369c91e54..b9f11931ef785256c2b86e80fb1ae3a71769a89c 100644 (file)
@@ -236,11 +236,6 @@ static int __init rseq_debugfs_init(void)
 }
 __initcall(rseq_debugfs_init);
 
-static bool rseq_set_ids(struct task_struct *t, struct rseq_ids *ids, u32 node_id)
-{
-       return rseq_set_ids_get_csaddr(t, ids, node_id, NULL);
-}
-
 static bool rseq_handle_cs(struct task_struct *t, struct pt_regs *regs)
 {
        struct rseq __user *urseq = t->rseq.usrptr;
@@ -384,19 +379,22 @@ void rseq_syscall(struct pt_regs *regs)
 
 static bool rseq_reset_ids(void)
 {
-       struct rseq_ids ids = {
-               .cpu_id         = RSEQ_CPU_ID_UNINITIALIZED,
-               .mm_cid         = 0,
-       };
+       struct rseq __user *rseq = current->rseq.usrptr;
 
        /*
         * If this fails, terminate it because this leaves the kernel in
         * stupid state as exit to user space will try to fixup the ids
         * again.
         */
-       if (rseq_set_ids(current, &ids, 0))
-               return true;
+       scoped_user_rw_access(rseq, efault) {
+               unsafe_put_user(0, &rseq->cpu_id_start, efault);
+               unsafe_put_user(RSEQ_CPU_ID_UNINITIALIZED, &rseq->cpu_id, efault);
+               unsafe_put_user(0, &rseq->node_id, efault);
+               unsafe_put_user(0, &rseq->mm_cid, efault);
+       }
+       return true;
 
+efault:
        force_sig(SIGSEGV);
        return false;
 }