On 3/28/23 12:52 PM, Al Viro wrote: > On Tue, Mar 28, 2023 at 11:52:10AM -0600, Jens Axboe wrote: >> On 3/28/23 11:50 AM, Linus Torvalds wrote: >>> On Tue, Mar 28, 2023 at 10:36 AM Jens Axboe <axboe@xxxxxxxxx> wrote: >>>> >>>> @@ -3516,23 +3516,28 @@ static void __user **snd_map_bufs(struct snd_pcm_runtime *runtime, >>>> struct iov_iter *iter, >>>> snd_pcm_uframes_t *frames, int max_segs) >>>> { >>>> + int nr_segs = iovec_nr_user_vecs(iter); >>> >>> This has a WARN_ON_ONCE() for !user_backed, but then.. >>> >>>> void __user **bufs; >>>> + struct iovec iov; >>>> unsigned long i; >>>> >>>> if (!iter->user_backed) >>>> return ERR_PTR(-EFAULT); >>> >>> here the code tries to deal with it. >>> >>> So I think the two should probably be switched around. >> >> True, it was actually like that before I refactored it to include >> that common helper. I'll swap them around, thanks. > > Umm... That looks really weird - if nothing else, it seems that this > thing quietly ignores the ->iov_len on all but the first iovec. I agree, but this is how it currently works... > Might make sense to ask ALSA folks what the hell is going on there; > it's readv()/writev() on pcm device, and it looks like userland ABI > is really perverted here... ;-/ I have sent them email separately to confirm that the only cases that makes sense here is nr_segs >= 2. But the ABI is what it is, however horrible it may be :/ -- Jens Axboe