On 1/20/20 4:51 PM, Dmitry V. Levin wrote: > On Wed, Jan 15, 2020 at 09:53:27AM -0700, Jens Axboe wrote: >> On 1/15/20 9:50 AM, Eugene Syromiatnikov wrote: >>> On Wed, Jan 15, 2020 at 09:41:58AM -0700, Jens Axboe wrote: >>>> On 1/15/20 9:35 AM, Eugene Syromiatnikov wrote: >>>>> fds field of struct io_uring_files_update is problematic with regards >>>>> to compat user space, as pointer size is different in 32-bit, 32-on-64-bit, >>>>> and 64-bit user space. In order to avoid custom handling of compat in >>>>> the syscall implementation, make fds __u64 and use u64_to_user_ptr in >>>>> order to retrieve it. Also, align the field naturally and check that >>>>> no garbage is passed there. >>>> >>>> Good point, it's an s32 pointer so won't align nicely. But how about >>>> just having it be: >>>> >>>> struct io_uring_files_update { >>>> __u32 offset; >>>> __u32 resv; >>>> __s32 *fds; >>>> }; >>>> >>>> which should align nicely on both 32 and 64-bit? >>> >>> The issue is that 32-bit user space would pass a 12-byte structure with >>> a 4-byte pointer in it to the 64-bit kernel, that, in turn, would treat it >>> as a 8-byte value (which might sometimes work on little-endian architectures, >>> if there are happen to be zeroes after the pointer, but will be always broken >>> on big-endian ones). __u64 is used in order to avoid special compat wrapper; >>> see, for example, __u64 usage in btrfs or BPF for similar purposes. >> >> Ah yes, I'm an idiot, apparently not enough coffee yet. We'd need it in >> a union for this to work. I'll just go with yours, it'll work just fine. >> I will fold it in, I need to make some updates and rebase anyway. > > I see the patch has missed v5.5-rc7. > Jens, please make sure a fix is merged before v5.5 is out. Ah shoot, I actually thought I added it for 5.6 only, but you are right, it's in 5.5-rc as well. I'll ship a patch this week for 5.5. -- Jens Axboe