On Wed, Sep 25, 2019 at 10:00 AM Aleksa Sarai [off-list ref] wrote:
+int is_zeroed_user(const void __user *from, size_t size)
I like how you've done this, but it's buggy and only works on 64-bit.
All the "u64" and "8" cases need to be "unsigned long" and
"sizeof(unsigned long)".
Part of that requirement is:
+ unsafe_get_user(val, (u64 __user *) from, err_fault);
This part works fine - although 64-bit accesses migth be much more
expensive and the win of unrolling might not be sufficient - but:
quoted hunk ↗ jump to hunk
+ if (align) {
+ /* @from is unaligned. */
+ val &= ~aligned_byte_mask(align);
+ align = 0;
+ }
This part fundamentally only works on 'unsigned long'.
Linus