On Sun, Oct 6, 2019 at 7:50 PM Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > > Out of those, only __copy_to_user_inatomic(), __copy_to_user(), > _copy_to_user() and iov_iter.c:copyout() can be called on > any architecture. > > The last two should just do user_access_begin()/user_access_end() > instead of access_ok(). __copy_to_user_inatomic() has very few callers as well: Yeah, good points. It looks like it would be better to just change over semantics entirely to the unsafe_copy_user() model. > So few, in fact, that I wonder if we want to keep it at all; the only > thing stopping me from "let's remove it" is that I don't understand > the i915 side of things. Where does it do an equivalent of access_ok()? Honestly, if you have to ask, I think the answer is: just add one. Every single time we've had people who optimized things to try to avoid the access_ok(), they just caused bugs and problems. In this case, I think it's done a few callers up in i915_gem_pread_ioctl(): if (!access_ok(u64_to_user_ptr(args->data_ptr), args->size)) return -EFAULT; but honestly, trying to optimize away another "access_ok()" is just not worth it. I'd rather have an extra one than miss one. > And mm/maccess.c one is __probe_kernel_write(), so presumably we don't > want stac/clac there at all... Yup. > So do we want to bother with separation between raw_copy_to_user() and > unsafe_copy_to_user()? After all, __copy_to_user() also has only few > callers, most of them in arch/* No, you're right. Just switch over. > I'll take a look into that tomorrow - half-asleep right now... Thanks. No huge hurry. Linus