From: david.laight.linux@gmail•com
To: Alexander Viro <viro@zeniv•linux.org.uk>,
Andre Almeida <andrealmeid@igalia•com>,
Andrew Cooper <andrew.cooper3@citrix•com>,
Christian Borntraeger <borntraeger@linux•ibm.com>,
Christian Brauner <brauner@kernel•org>,
Christophe Leroy <christophe.leroy@csgroup•eu>,
"Christophe Leroy (CS GROUP)" <chleroy@kernel•org>,
Darren Hart <dvhart@infradead•org>,
David Laight <david.laight.linux@gmail•com>,
Davidlohr Bueso <dave@stgolabs•net>,
Heiko Carstens <hca@linux•ibm.com>, Jan Kara <jack@suse•cz>,
Julia Lawall <Julia.Lawall@inria•fr>,
Linus Torvalds <torvalds@linux-foundation•org>,
linux-arm-kernel@lists•infradead.org,
linux-fsdevel@vger•kernel.org, linuxppc-dev@lists•ozlabs.org,
linux-riscv@lists•infradead.org, linux-s390@vger•kernel.org,
LKML <linux-kernel@vger•kernel.org>,
Madhavan Srinivasan <maddy@linux•ibm.com>,
Mathieu Desnoyers <mathieu.desnoyers@efficios•com>,
Michael Ellerman <mpe@ellerman•id.au>,
Nicholas Piggin <npiggin@gmail•com>,
Nicolas Palix <nicolas.palix@imag•fr>,
Palmer Dabbelt <palmer@dabbelt•com>,
Paul Walmsley <pjw@kernel•org>,
Peter Zijlstra <peterz@infradead•org>,
Russell King <linux@armlinux•org.uk>,
Sven Schnelle <svens@linux•ibm.com>,
Thomas Gleixner <tglx@linutronix•de>,
x86@kernel•org, Kees Cook <kees@kernel•org>,
akpm@linux-foundation•org
Subject: [PATCH v2 1/5] uaccess: Fix scoped_user_read_access() for 'pointer to const'
Date: Mon, 2 Mar 2026 13:27:51 +0000 [thread overview]
Message-ID: <20260302132755.1475451-2-david.laight.linux@gmail.com> (raw)
In-Reply-To: <20260302132755.1475451-1-david.laight.linux@gmail.com>
From: David Laight <david.laight.linux@gmail•com>
If a 'const struct foo __user *ptr' is used for the address passed
to scoped_user_read_access() then you get a warning/error
uaccess.h:691:1: error: initialization discards 'const' qualifier
from pointer target type [-Werror=discarded-qualifiers]
for the
void __user *_tmpptr = __scoped_user_access_begin(mode, uptr, size, elbl)
assignment.
Fix by using 'auto' for both _tmpptr and the redeclaration of uptr.
Replace the CLASS() with explicit __cleanup() functions on uptr.
Fixes: e497310b4ffb "(uaccess: Provide scoped user access regions)"
Signed-off-by: David Laight <david.laight.linux@gmail•com>
---
include/linux/uaccess.h | 54 +++++++++++++++--------------------------
1 file changed, 20 insertions(+), 34 deletions(-)
diff --git a/include/linux/uaccess.h b/include/linux/uaccess.h
index 1f3804245c06..809e4f7dfdbd 100644
--- a/include/linux/uaccess.h
+++ b/include/linux/uaccess.h
@@ -647,36 +647,22 @@ static inline void user_access_restore(unsigned long flags) { }
/* Define RW variant so the below _mode macro expansion works */
#define masked_user_rw_access_begin(u) masked_user_access_begin(u)
#define user_rw_access_begin(u, s) user_access_begin(u, s)
-#define user_rw_access_end() user_access_end()
/* Scoped user access */
-#define USER_ACCESS_GUARD(_mode) \
-static __always_inline void __user * \
-class_user_##_mode##_begin(void __user *ptr) \
-{ \
- return ptr; \
-} \
- \
-static __always_inline void \
-class_user_##_mode##_end(void __user *ptr) \
-{ \
- user_##_mode##_access_end(); \
-} \
- \
-DEFINE_CLASS(user_ ##_mode## _access, void __user *, \
- class_user_##_mode##_end(_T), \
- class_user_##_mode##_begin(ptr), void __user *ptr) \
- \
-static __always_inline class_user_##_mode##_access_t \
-class_user_##_mode##_access_ptr(void __user *scope) \
-{ \
- return scope; \
-}
-USER_ACCESS_GUARD(read)
-USER_ACCESS_GUARD(write)
-USER_ACCESS_GUARD(rw)
-#undef USER_ACCESS_GUARD
+/* Cleanup wrapper functions */
+static __always_inline void __scoped_user_read_access_end(const void *p)
+{
+ user_read_access_end();
+};
+static __always_inline void __scoped_user_write_access_end(const void *p)
+{
+ user_write_access_end();
+};
+static __always_inline void __scoped_user_rw_access_end(const void *p)
+{
+ user_access_end();
+};
/**
* __scoped_user_access_begin - Start a scoped user access
@@ -750,13 +736,13 @@ USER_ACCESS_GUARD(rw)
*
* Don't use directly. Use scoped_masked_user_$MODE_access() instead.
*/
-#define __scoped_user_access(mode, uptr, size, elbl) \
-for (bool done = false; !done; done = true) \
- for (void __user *_tmpptr = __scoped_user_access_begin(mode, uptr, size, elbl); \
- !done; done = true) \
- for (CLASS(user_##mode##_access, scope)(_tmpptr); !done; done = true) \
- /* Force modified pointer usage within the scope */ \
- for (const typeof(uptr) uptr = _tmpptr; !done; done = true)
+#define __scoped_user_access(mode, uptr, size, elbl) \
+for (bool done = false; !done; done = true) \
+ for (auto _tmpptr = __scoped_user_access_begin(mode, uptr, size, elbl); \
+ !done; done = true) \
+ /* Force modified pointer usage within the scope */ \
+ for (const auto uptr __cleanup(__scoped_user_##mode##_access_end) = \
+ _tmpptr; !done; done = true)
/**
* scoped_user_read_access_size - Start a scoped user read access with given size
--
2.39.5
next prev parent reply other threads:[~2026-03-02 14:05 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-02 13:27 [PATCH v2 0/5] uaccess: Updates to scoped_user_access() david.laight.linux
2026-03-02 13:27 ` david.laight.linux [this message]
2026-03-02 14:59 ` [PATCH v2 1/5] uaccess: Fix scoped_user_read_access() for 'pointer to const' Christophe Leroy (CS GROUP)
2026-03-02 17:26 ` Linus Torvalds
2026-03-02 18:55 ` David Laight
2026-03-02 13:27 ` [PATCH v2 2/5] compiler.h: Add generic support for 'autoterminating nested for() loops' david.laight.linux
2026-03-02 13:27 ` [PATCH v2 3/5] uaccess.h: Use with() and and_with() in __scoped_user_access() david.laight.linux
2026-03-02 13:27 ` [PATCH v2 4/5] uaccess: Disable -Wshadow " david.laight.linux
2026-03-02 15:00 ` Christophe Leroy (CS GROUP)
2026-03-03 9:12 ` David Laight
2026-03-02 17:17 ` Linus Torvalds
2026-03-05 8:10 ` kernel test robot
2026-03-02 13:27 ` [PATCH v2 next 5/5] signal: Use scoped_user_access() instead of __put/get_user() david.laight.linux
2026-03-02 16:07 ` Christophe Leroy (CS GROUP)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260302132755.1475451-2-david.laight.linux@gmail.com \
--to=david.laight.linux@gmail$(echo .)com \
--cc=Julia.Lawall@inria$(echo .)fr \
--cc=akpm@linux-foundation$(echo .)org \
--cc=andrealmeid@igalia$(echo .)com \
--cc=andrew.cooper3@citrix$(echo .)com \
--cc=borntraeger@linux$(echo .)ibm.com \
--cc=brauner@kernel$(echo .)org \
--cc=chleroy@kernel$(echo .)org \
--cc=christophe.leroy@csgroup$(echo .)eu \
--cc=dave@stgolabs$(echo .)net \
--cc=dvhart@infradead$(echo .)org \
--cc=hca@linux$(echo .)ibm.com \
--cc=jack@suse$(echo .)cz \
--cc=kees@kernel$(echo .)org \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
--cc=linux-fsdevel@vger$(echo .)kernel.org \
--cc=linux-kernel@vger$(echo .)kernel.org \
--cc=linux-riscv@lists$(echo .)infradead.org \
--cc=linux-s390@vger$(echo .)kernel.org \
--cc=linux@armlinux$(echo .)org.uk \
--cc=linuxppc-dev@lists$(echo .)ozlabs.org \
--cc=maddy@linux$(echo .)ibm.com \
--cc=mathieu.desnoyers@efficios$(echo .)com \
--cc=mpe@ellerman$(echo .)id.au \
--cc=nicolas.palix@imag$(echo .)fr \
--cc=npiggin@gmail$(echo .)com \
--cc=palmer@dabbelt$(echo .)com \
--cc=peterz@infradead$(echo .)org \
--cc=pjw@kernel$(echo .)org \
--cc=svens@linux$(echo .)ibm.com \
--cc=tglx@linutronix$(echo .)de \
--cc=torvalds@linux-foundation$(echo .)org \
--cc=viro@zeniv$(echo .)linux.org.uk \
--cc=x86@kernel$(echo .)org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox