]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iov_iter: Add missing speculation barrier to copy_from_user_iter()
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Mon, 17 Nov 2025 16:43:42 +0000 (17:43 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 18 Nov 2025 14:27:34 +0000 (15:27 +0100)
The results of "access_ok()" can be mis-speculated.  The result is that
the CPU can end speculatively:

if (access_ok(from, size))
// Right here

For the same reason as done in copy_from_user() in commit 74e19ef0ff80
("uaccess: Add speculation barrier to copy_from_user()"), add a speculation
barrier to copy_from_user_iter().

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://patch.msgid.link/6b73e69cc7168c89df4eab0a216e3ed4cca36b0a.1763396724.git.christophe.leroy@csgroup.eu
lib/iov_iter.c

index a589935bf302587a3721eed03291298ba0a62cab..896760bad455fc535fce20159e6d33bf3cd7a7b5 100644 (file)
@@ -49,11 +49,19 @@ size_t copy_from_user_iter(void __user *iter_from, size_t progress,
 
        if (should_fail_usercopy())
                return len;
-       if (can_do_masked_user_access())
+       if (can_do_masked_user_access()) {
                iter_from = mask_user_address(iter_from);
-       else if (!access_ok(iter_from, len))
-               return res;
+       } else {
+               if (!access_ok(iter_from, len))
+                       return res;
 
+               /*
+                * Ensure that bad access_ok() speculation will not
+                * lead to nasty side effects *after* the copy is
+                * finished:
+                */
+               barrier_nospec();
+       }
        to += progress;
        instrument_copy_from_user_before(to, iter_from, len);
        res = raw_copy_from_user(to, iter_from, len);