Re: [PATCH 2/3] vmsplice: make vmsplice a trivial wrapper for preadv2/pwritev2
Linus Torvalds <[email protected]>
| Newsgroups | org.kernel.vger.linux-api,dev.linux.lists.patches,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.netdev,org.kvack.linux-mm |
|---|---|
| Message-ID | <CAHk-=whMTq8_2rpYoZgoxVCwj=LsvfzHzPuwo-NcizT7J24MPQ@mail.gmail.com> |
On Fri, 5 Jun 2026 at 08:54, Linus Torvalds <[email protected]> wrote: > > If it were to have the same issue that powerpc(*) had - that 'unsigned > int' has to be passed to functions with well-defined high bits - that > would be bad. > > And I'm pretty sure that clang doesn't do that. It's perhaps worth nothing *why* it's horribly bad and why I think the powerpc ABI is nasty: it means that *some* things are done in 32 bits, but other things then expect the upper bits to always match. It caused security issues, where user space would (for example) pass in a 'int fd' what was value in the low bits, and then had interesting upper bits. The range check in the kernel would then compare fd to max_fds - using a 32-bit unsigned compare - and see that it is all in range. Then it would use the *exact same fd variable* to index into the fd array, but the compiler would use the full 64-bit value for that array dereference - without having ever checked those upper bits. And it had passed the unmodified full 64-bit value around the whole time, all the way from untrusted user space, and the kernel code all looked "obviously correct" and had all the proper checks in place. If you want to bleed out of your eyes, take a look at the rather horrendous macros in <linux/syscalls.h> (and the sometimes even more horrendous arch 'syscall_wrappers.h' files). They deal with issues like this - and others - with some truly inscrutable code. You have to be super-human to be able to read it, but those wrappers are why we can then just do things like SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid) and it will generate not only infrastructure for tracing etc, but also the code necessary to force clean up the types for the architecture. Linus