starnix_core/vfs/buffers/
io_buffers.rs

1// Copyright 2023 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::mm::{
6    MemoryAccessorExt, NumberOfElementsRead, RemoteMemoryManager, TaskMemoryAccessor,
7    UNIFIED_ASPACES_ENABLED, read_to_array, read_to_object_as_bytes, read_to_vec,
8};
9use crate::task::{CurrentTask, Task};
10use smallvec::{SmallVec, smallvec};
11use starnix_types::user_buffer::{UserBuffer, UserBuffers};
12use starnix_uapi::errors::{ENOTSUP, Errno};
13use starnix_uapi::user_address::UserAddress;
14use starnix_uapi::{errno, error};
15use std::mem::MaybeUninit;
16use std::ops::{Deref, DerefMut};
17use zerocopy::FromBytes;
18
19/// The callback for `OutputBuffer::write_each`. The callback is passed the buffers to write to in
20/// order, and must return for each, how many bytes has been written.
21pub type OutputBufferCallback<'a> = dyn FnMut(&mut [MaybeUninit<u8>]) -> Result<usize, Errno> + 'a;
22
23fn slice_to_maybe_uninit(buffer: &[u8]) -> &[MaybeUninit<u8>] {
24    // SAFETY: &[u8] and &[MaybeUninit<u8>] have the same layout.
25    unsafe { std::slice::from_raw_parts(buffer.as_ptr() as *const MaybeUninit<u8>, buffer.len()) }
26}
27
28pub trait Iovec: Sized {
29    fn create(buffer: &UserBuffer) -> Self;
30}
31
32impl Iovec for syncio::zxio::iovec {
33    fn create(buffer: &UserBuffer) -> Self {
34        Self { iov_base: buffer.address.ptr() as *mut starnix_uapi::c_void, iov_len: buffer.length }
35    }
36}
37
38impl Iovec for syncio::zxio::zx_iovec {
39    fn create(buffer: &UserBuffer) -> Self {
40        Self { buffer: buffer.address.ptr() as *mut starnix_uapi::c_void, capacity: buffer.length }
41    }
42}
43
44const IOVECS_IN_HEAP_THRESHOLD: usize = 5;
45
46/// Provides access to a slice of iovecs while retaining some reference.
47pub struct IovecsRef<'a, I: Sized> {
48    iovecs: SmallVec<[I; IOVECS_IN_HEAP_THRESHOLD]>,
49    _marker: std::marker::PhantomData<&'a I>,
50}
51
52impl<'a, I: Iovec> IovecsRef<'a, I> {
53    /// Returns the list of iovecs backing the buffer.
54    ///
55    /// Note that we use `IovecsRef<'_>` so that while `IovecsRef` is held,
56    /// no other methods may be called on the `Buffer` since `IovecsRef`
57    /// holds onto the mutable reference for the `Buffer`.
58    fn new<B: Buffer + ?Sized>(buf: &'a mut B) -> Result<Self, Errno> {
59        let mut iovecs = SmallVec::with_capacity(buf.segments_count()?);
60        buf.peek_each_segment(&mut |buffer| iovecs.push(I::create(buffer)))?;
61        Ok(IovecsRef { iovecs, _marker: Default::default() })
62    }
63}
64
65impl<I> Deref for IovecsRef<'_, I> {
66    type Target = [I];
67    fn deref(&self) -> &Self::Target {
68        &self.iovecs
69    }
70}
71
72impl<I> DerefMut for IovecsRef<'_, I> {
73    fn deref_mut(&mut self) -> &mut Self::Target {
74        &mut self.iovecs
75    }
76}
77
78pub type PeekBufferSegmentsCallback<'a> = dyn FnMut(&UserBuffer) + 'a;
79
80/// A buffer.
81///
82/// Provides the common implementations for input and output buffers.
83pub trait Buffer: std::fmt::Debug {
84    /// Returns the number of segments, if the buffer supports I/O directly
85    /// to/from individual segments.
86    fn segments_count(&self) -> Result<usize, Errno>;
87
88    /// Calls the callback with each segment backing this buffer.
89    ///
90    /// Each segment is safe to read from (if this is an `InputBuffer`) or write
91    /// to (if this is an `OutputBuffer`) without causing undefined behaviour.
92    fn peek_each_segment(
93        &mut self,
94        callback: &mut PeekBufferSegmentsCallback<'_>,
95    ) -> Result<(), Errno>;
96
97    /// Returns all the segments backing this `Buffer`.
98    ///
99    /// Note that we use `IovecsRef<'_>` so that while `IovecsRef` is held,
100    /// no other methods may be called on this `Buffer` since `IovecsRef`
101    /// holds onto the mutable reference for this `Buffer`.
102    ///
103    /// Each segment is safe to read from (if this is an `InputBuffer`) or write
104    /// to (if this is an `OutputBuffer`) without causing undefined behaviour.
105    fn peek_all_segments_as_iovecs(&mut self) -> Result<IovecsRef<'_, syncio::zxio::iovec>, Errno> {
106        IovecsRef::new(self)
107    }
108}
109
110/// Attempts to perform some I/O with the iovec segments of `Buffer`.
111///
112/// Returns `None` if the I/O can not be performed with iovecs (when unified
113/// aspaces is disabled or the `Buffer` does not support I/O on its segments
114/// directly).
115///
116/// Each segment is safe to read from (if `B` is an `InputBuffer`) or write
117/// to (if `B` is an `OutputBuffer`) without causing undefined behaviour.
118pub fn with_iovec_segments<B: Buffer + ?Sized, I: Iovec, T>(
119    data: &mut B,
120    f: impl FnOnce(&mut [I]) -> Result<T, Errno>,
121) -> Option<Result<T, Errno>> {
122    if !UNIFIED_ASPACES_ENABLED {
123        return None;
124    }
125
126    match IovecsRef::new(data) {
127        Ok(mut o) => Some(f(&mut o)),
128        Err(e) => {
129            if e.code == ENOTSUP {
130                None
131            } else {
132                Some(Err(e))
133            }
134        }
135    }
136}
137
138/// The OutputBuffer allows for writing bytes to a buffer.
139/// A single OutputBuffer will only write up to MAX_RW_COUNT bytes which is the maximum size of a
140/// single operation.
141pub trait OutputBuffer: Buffer {
142    /// Calls `callback` for each segment to write data for. `callback` must returns the number of
143    /// bytes actually written. When it returns less than the size of the input buffer, the write
144    /// is stopped.
145    ///
146    /// Returns the total number of bytes written.
147    fn write_each(&mut self, callback: &mut OutputBufferCallback<'_>) -> Result<usize, Errno>;
148
149    /// Returns the number of bytes available to be written into the buffer.
150    fn available(&self) -> usize;
151
152    /// Returns the number of bytes already written into the buffer.
153    fn bytes_written(&self) -> usize;
154
155    /// Fills this buffer with zeros.
156    fn zero(&mut self) -> Result<usize, Errno>;
157
158    /// Advance the output buffer by `length` bytes.
159    ///
160    /// # Safety
161    ///
162    /// The caller must guarantee that the length bytes are initialized.
163    unsafe fn advance(&mut self, length: usize) -> Result<(), Errno>;
164
165    /// Write the content of `buffer` into this buffer. If this buffer is too small, the write will
166    /// be partial.
167    ///
168    /// Returns the number of bytes written in this buffer.
169    fn write(&mut self, buffer: &[u8]) -> Result<usize, Errno> {
170        let mut buffer = slice_to_maybe_uninit(buffer);
171
172        self.write_each(&mut move |data| {
173            let size = std::cmp::min(buffer.len(), data.len());
174            let (to_clone, remaining) = buffer.split_at(size);
175            data[0..size].clone_from_slice(to_clone);
176            buffer = remaining;
177            Ok(size)
178        })
179    }
180
181    /// Write the content of `buffer` into this buffer. It is an error to pass a buffer larger than
182    /// the number of bytes available in this buffer. In that case, the content of the buffer after
183    /// the operation is unspecified.
184    ///
185    /// In case of success, always returns `buffer.len()`.
186    fn write_all(&mut self, buffer: &[u8]) -> Result<usize, Errno> {
187        let size = self.write(buffer)?;
188        if size != buffer.len() { error!(EINVAL) } else { Ok(size) }
189    }
190
191    /// Write the content of the given `InputBuffer` into this buffer. The number of bytes written
192    /// will be the smallest between the number of bytes available in this buffer and in the
193    /// `InputBuffer`.
194    ///
195    /// Returns the number of bytes read and written.
196    fn write_buffer(&mut self, input: &mut dyn InputBuffer) -> Result<usize, Errno> {
197        self.write_each(&mut move |data| {
198            let size = std::cmp::min(data.len(), input.available());
199            input.read_exact(&mut data[0..size])
200        })
201    }
202}
203
204/// The callback for `InputBuffer::peek_each` and `InputBuffer::read_each`. The callback is passed
205/// the buffers to write to in order, and must return for each, how many bytes has been read.
206
207pub type InputBufferCallback<'a> = dyn FnMut(&[u8]) -> Result<usize, Errno> + 'a;
208
209/// The InputBuffer allows for reading bytes from a buffer.
210/// A single InputBuffer will only read up to MAX_RW_COUNT bytes which is the maximum size of a
211/// single operation.
212pub trait InputBuffer: Buffer {
213    /// Calls `callback` for each segment to peek data from. `callback` must returns the number of
214    /// bytes actually peeked. When it returns less than the size of the output buffer, the read
215    /// is stopped.
216    ///
217    /// Returns the total number of bytes peeked.
218    fn peek_each(&mut self, callback: &mut InputBufferCallback<'_>) -> Result<usize, Errno>;
219
220    /// Returns the number of bytes available to be read from the buffer.
221    fn available(&self) -> usize;
222
223    /// Returns the number of bytes already read from the buffer.
224    fn bytes_read(&self) -> usize;
225
226    /// Clear the remaining content in the buffer. Returns the number of bytes swallowed. After this
227    /// method returns, `available()` will returns 0. This does not touch the data in the buffer.
228    fn drain(&mut self) -> usize;
229
230    /// Consumes `length` bytes of data from this buffer.
231    fn advance(&mut self, length: usize) -> Result<(), Errno>;
232
233    /// Calls `callback` for each segment to read data from. `callback` must returns the number of
234    /// bytes actually read. When it returns less than the size of the output buffer, the read
235    /// is stopped.
236    ///
237    /// Returns the total number of bytes read.
238    fn read_each(&mut self, callback: &mut InputBufferCallback<'_>) -> Result<usize, Errno> {
239        let length = self.peek_each(callback)?;
240        self.advance(length)?;
241        Ok(length)
242    }
243
244    /// Read all the remaining content in this buffer and returns it as a `Vec`.
245    fn read_all(&mut self) -> Result<Vec<u8>, Errno> {
246        let result = self.peek_all()?;
247        let drain_result = self.drain();
248        assert!(result.len() == drain_result);
249        Ok(result)
250    }
251
252    /// Peek all the remaining content in this buffer and returns it as a `Vec`.
253    fn peek_all(&mut self) -> Result<Vec<u8>, Errno> {
254        // SAFETY: self.peek returns the number of bytes read.
255        unsafe {
256            read_to_vec::<u8, _>(self.available(), |buf| self.peek(buf).map(NumberOfElementsRead))
257        }
258    }
259
260    /// Peeks the content of this buffer into `buffer`.
261    /// If `buffer` is too small, the read will be partial.
262    /// If `buffer` is too large, the remaining bytes will be left untouched.
263    ///
264    /// Returns the number of bytes read from this buffer.
265    fn peek(&mut self, buffer: &mut [MaybeUninit<u8>]) -> Result<usize, Errno> {
266        let mut index = 0;
267        self.peek_each(&mut move |data| {
268            let data = slice_to_maybe_uninit(data);
269            let size = std::cmp::min(buffer.len() - index, data.len());
270            buffer[index..index + size].clone_from_slice(&data[..size]);
271            index += size;
272            Ok(size)
273        })
274    }
275
276    /// Write the content of this buffer into `buffer`.
277    /// If `buffer` is too small, the read will be partial.
278    /// If `buffer` is too large, the remaining bytes will be left untouched.
279    ///
280    /// Returns the number of bytes read from this buffer.
281    fn read(&mut self, buffer: &mut [MaybeUninit<u8>]) -> Result<usize, Errno> {
282        let length = self.peek(buffer)?;
283        self.advance(length)?;
284        Ok(length)
285    }
286
287    /// Read the exact number of bytes required to fill buf.
288    ///
289    /// If `buffer` is larger than the number of available bytes, an error will be returned.
290    ///
291    /// In case of success, always returns `buffer.len()`.
292    fn read_exact(&mut self, buffer: &mut [MaybeUninit<u8>]) -> Result<usize, Errno> {
293        let size = self.read(buffer)?;
294        if size != buffer.len() { error!(EINVAL) } else { Ok(size) }
295    }
296}
297
298pub trait InputBufferExt: InputBuffer {
299    /// Reads exactly `len` bytes into a returned `Vec`.
300    ///
301    /// Returns an error if `len` is larger than the number of available bytes.
302    fn read_to_vec_exact(&mut self, len: usize) -> Result<Vec<u8>, Errno> {
303        // SAFETY: `data.read_exact` returns `len` bytes on success.
304        unsafe { read_to_vec::<u8, _>(len, |buf| self.read_exact(buf).map(NumberOfElementsRead)) }
305    }
306
307    /// Reads up to `limit` bytes into a returned `Vec`.
308    fn read_to_vec_limited(&mut self, limit: usize) -> Result<Vec<u8>, Errno> {
309        // SAFETY: `data.read` returns the number of bytes read.
310        unsafe { read_to_vec::<u8, _>(limit, |buf| self.read(buf).map(NumberOfElementsRead)) }
311    }
312
313    /// Reads bytes into the array.
314    ///
315    /// Returns an error if `N` is larger than the number of available bytes.
316    fn read_to_array<const N: usize>(&mut self) -> Result<[u8; N], Errno> {
317        // SAFETY: `data.read_exact` returns `N` bytes on success.
318        unsafe {
319            read_to_array::<_, _, N>(|buf| {
320                self.read_exact(buf).map(|bytes_read| debug_assert_eq!(bytes_read, buf.len()))
321            })
322        }
323    }
324
325    /// Interprets the buffer as an object.
326    ///
327    /// Returns an error if the buffer does not have enough bytes to represent the
328    /// object.
329    fn read_to_object<T: FromBytes>(&mut self) -> Result<T, Errno> {
330        // SAFETY: the callback returns successfully only if the required number of
331        // bytes were read.
332        unsafe {
333            read_to_object_as_bytes(|buf| {
334                if self.read(buf)? != buf.len() { error!(EINVAL) } else { Ok(()) }
335            })
336        }
337    }
338}
339
340impl InputBufferExt for dyn InputBuffer + '_ {}
341impl<T: InputBuffer> InputBufferExt for T {}
342
343/// An OutputBuffer that write data to user space memory through a `TaskMemoryAccessor`.
344pub struct UserBuffersOutputBuffer<'a, M> {
345    mm: &'a M,
346    buffers: UserBuffers,
347    available: usize,
348    bytes_written: usize,
349}
350
351impl<'a, M> std::fmt::Debug for UserBuffersOutputBuffer<'a, M> {
352    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
353        f.debug_struct("UserBuffersOutputBuffer")
354            .field("buffers", &self.buffers)
355            .field("available", &self.available)
356            .field("bytes_written", &self.bytes_written)
357            .finish()
358    }
359}
360
361impl<'a, M: TaskMemoryAccessor> UserBuffersOutputBuffer<'a, M> {
362    fn new_inner(mm: &'a M, mut buffers: UserBuffers) -> Result<Self, Errno> {
363        let available = UserBuffer::cap_buffers_to_max_rw_count(
364            mm.maximum_valid_address().ok_or_else(|| errno!(EINVAL))?,
365            &mut buffers,
366        )?;
367        // Reverse the buffers as the element will be removed as they are handled.
368        buffers.reverse();
369        Ok(Self { mm, buffers, available, bytes_written: 0 })
370    }
371
372    fn write_each_inner<B: AsRef<[u8]>, F: FnMut(usize) -> Result<B, Errno>>(
373        &mut self,
374        mut callback: F,
375    ) -> Result<usize, Errno> {
376        let mut bytes_written = 0;
377        while let Some(mut buffer) = self.buffers.pop() {
378            if buffer.is_null() {
379                continue;
380            }
381
382            let bytes = callback(buffer.length)?;
383            let bytes = bytes.as_ref();
384
385            bytes_written += self.mm.write_memory(buffer.address, bytes)?;
386            let bytes_len = bytes.len();
387            buffer.advance(bytes_len)?;
388            self.available -= bytes_len;
389            self.bytes_written += bytes_len;
390            if !buffer.is_empty() {
391                self.buffers.push(buffer);
392                break;
393            }
394        }
395        Ok(bytes_written)
396    }
397}
398
399impl<'a> UserBuffersOutputBuffer<'a, CurrentTask> {
400    pub fn unified_new(task: &'a CurrentTask, buffers: UserBuffers) -> Result<Self, Errno> {
401        Self::new_inner(task, buffers)
402    }
403
404    pub fn unified_new_at(
405        task: &'a CurrentTask,
406        address: UserAddress,
407        length: usize,
408    ) -> Result<Self, Errno> {
409        Self::unified_new(task, smallvec![UserBuffer { address, length }])
410    }
411}
412
413impl<'a> UserBuffersOutputBuffer<'a, Task> {
414    pub fn syscall_new(task: &'a Task, buffers: UserBuffers) -> Result<Self, Errno> {
415        Self::new_inner(task, buffers)
416    }
417}
418
419impl<'a> UserBuffersOutputBuffer<'a, RemoteMemoryManager> {
420    pub fn remote_new(mm: &'a RemoteMemoryManager, buffers: UserBuffers) -> Result<Self, Errno> {
421        Self::new_inner(mm, buffers)
422    }
423}
424
425impl<'a, M: TaskMemoryAccessor> Buffer for UserBuffersOutputBuffer<'a, M> {
426    fn segments_count(&self) -> Result<usize, Errno> {
427        Ok(self.buffers.len())
428    }
429
430    fn peek_each_segment(
431        &mut self,
432        callback: &mut PeekBufferSegmentsCallback<'_>,
433    ) -> Result<(), Errno> {
434        // This `UserBuffersOutputBuffer` made sure that each segment only pointed
435        // to valid user-space address ranges on creation so each `buffer` is
436        // safe to write to.
437        for buffer in self.buffers.iter().rev() {
438            if buffer.is_null() {
439                continue;
440            }
441            callback(buffer)
442        }
443
444        Ok(())
445    }
446}
447
448impl<'a, M: TaskMemoryAccessor> OutputBuffer for UserBuffersOutputBuffer<'a, M> {
449    fn write(&mut self, mut bytes: &[u8]) -> Result<usize, Errno> {
450        self.write_each_inner(|buflen| {
451            let bytes_len = std::cmp::min(bytes.len(), buflen);
452            let (to_write, remaining) = bytes.split_at(bytes_len);
453            bytes = remaining;
454            Ok(to_write)
455        })
456    }
457
458    fn write_each(&mut self, callback: &mut OutputBufferCallback<'_>) -> Result<usize, Errno> {
459        self.write_each_inner(|buflen| {
460            // SAFETY: `callback` returns the number of bytes read on success.
461            unsafe {
462                read_to_vec::<u8, _>(buflen, |buf| {
463                    let result = callback(buf)?;
464                    if result > buflen {
465                        return error!(EINVAL);
466                    }
467                    Ok(NumberOfElementsRead(result))
468                })
469            }
470        })
471    }
472
473    fn available(&self) -> usize {
474        self.available
475    }
476
477    fn bytes_written(&self) -> usize {
478        self.bytes_written
479    }
480
481    fn zero(&mut self) -> Result<usize, Errno> {
482        let mut bytes_written = 0;
483        while let Some(mut buffer) = self.buffers.pop() {
484            if buffer.is_null() {
485                continue;
486            }
487
488            let count = self.mm.zero(buffer.address, buffer.length)?;
489            buffer.advance(count)?;
490            bytes_written += count;
491
492            self.available -= count;
493            self.bytes_written += count;
494
495            if !buffer.is_empty() {
496                self.buffers.push(buffer);
497                break;
498            }
499        }
500
501        Ok(bytes_written)
502    }
503
504    unsafe fn advance(&mut self, mut length: usize) -> Result<(), Errno> {
505        if length > self.available() {
506            return error!(EINVAL);
507        }
508
509        while let Some(mut buffer) = self.buffers.pop() {
510            if buffer.is_null() {
511                continue;
512            }
513
514            let advance_by = std::cmp::min(length, buffer.length);
515            buffer.advance(advance_by)?;
516            self.available -= advance_by;
517            self.bytes_written += advance_by;
518            if !buffer.is_empty() {
519                self.buffers.push(buffer);
520                break;
521            }
522            length -= advance_by;
523        }
524
525        Ok(())
526    }
527}
528
529/// An InputBuffer that read data from user space memory through a `TaskMemoryAccessor`.
530pub struct UserBuffersInputBuffer<'a, M> {
531    mm: &'a M,
532    buffers: UserBuffers,
533    available: usize,
534    bytes_read: usize,
535}
536
537impl<'a, M> std::fmt::Debug for UserBuffersInputBuffer<'a, M> {
538    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
539        f.debug_struct("UserBuffersInputBuffer")
540            .field("buffers", &self.buffers)
541            .field("available", &self.available)
542            .field("bytes_read", &self.bytes_read)
543            .finish()
544    }
545}
546
547impl<'a, M: TaskMemoryAccessor> UserBuffersInputBuffer<'a, M> {
548    fn new_inner(mm: &'a M, mut buffers: UserBuffers) -> Result<Self, Errno> {
549        let available = UserBuffer::cap_buffers_to_max_rw_count(
550            mm.maximum_valid_address().ok_or_else(|| errno!(EINVAL))?,
551            &mut buffers,
552        )?;
553        // Reverse the buffers as the element will be removed as they are handled.
554        buffers.reverse();
555        Ok(Self { mm, buffers, available, bytes_read: 0 })
556    }
557
558    fn peek_each_inner<F: FnMut(&UserBuffer, usize) -> Result<usize, Errno>>(
559        &mut self,
560        mut callback: F,
561    ) -> Result<usize, Errno> {
562        let mut read = 0;
563        for buffer in self.buffers.iter().rev() {
564            if buffer.is_null() {
565                continue;
566            }
567
568            let result = callback(buffer, read)?;
569            if result > buffer.length {
570                return error!(EINVAL);
571            }
572            read += result;
573            if result != buffer.length {
574                break;
575            }
576        }
577        Ok(read)
578    }
579}
580
581impl<'a> UserBuffersInputBuffer<'a, CurrentTask> {
582    pub fn unified_new(task: &'a CurrentTask, buffers: UserBuffers) -> Result<Self, Errno> {
583        Self::new_inner(task, buffers)
584    }
585
586    pub fn unified_new_at(
587        task: &'a CurrentTask,
588        address: UserAddress,
589        length: usize,
590    ) -> Result<Self, Errno> {
591        Self::unified_new(task, smallvec![UserBuffer { address, length }])
592    }
593}
594
595impl<'a> UserBuffersInputBuffer<'a, Task> {
596    pub fn syscall_new(task: &'a Task, buffers: UserBuffers) -> Result<Self, Errno> {
597        Self::new_inner(task, buffers)
598    }
599}
600
601impl<'a> UserBuffersInputBuffer<'a, RemoteMemoryManager> {
602    pub fn remote_new(mm: &'a RemoteMemoryManager, buffers: UserBuffers) -> Result<Self, Errno> {
603        Self::new_inner(mm, buffers)
604    }
605}
606
607impl<'a, M: TaskMemoryAccessor> Buffer for UserBuffersInputBuffer<'a, M> {
608    fn segments_count(&self) -> Result<usize, Errno> {
609        Ok(self.buffers.iter().filter(|b| b.is_null()).count())
610    }
611
612    fn peek_each_segment(
613        &mut self,
614        callback: &mut PeekBufferSegmentsCallback<'_>,
615    ) -> Result<(), Errno> {
616        // This `UserBuffersInputBuffer` made sure that each segment only pointed
617        // to valid user-space address ranges on creation so each `buffer` is
618        // safe to read from.
619        for buffer in self.buffers.iter().rev() {
620            if buffer.is_null() {
621                continue;
622            }
623            callback(buffer)
624        }
625
626        Ok(())
627    }
628}
629
630impl<'a, M: TaskMemoryAccessor> InputBuffer for UserBuffersInputBuffer<'a, M> {
631    fn peek(&mut self, uninit_bytes: &mut [MaybeUninit<u8>]) -> Result<usize, Errno> {
632        self.peek_each_inner(|buffer, read_so_far| {
633            let read_to = &mut uninit_bytes[read_so_far..];
634            let read_count = std::cmp::min(buffer.length, read_to.len());
635            let read_to = &mut read_to[..read_count];
636            let read_bytes = self.mm.read_memory(buffer.address, read_to)?;
637            debug_assert_eq!(read_bytes.len(), read_count);
638            Ok(read_count)
639        })
640    }
641
642    fn peek_each(&mut self, callback: &mut InputBufferCallback<'_>) -> Result<usize, Errno> {
643        self.peek_each_inner(|buffer, _read_so_far| {
644            let bytes = self.mm.read_memory_to_vec(buffer.address, buffer.length)?;
645            callback(&bytes)
646        })
647    }
648
649    fn drain(&mut self) -> usize {
650        let result = self.available;
651        self.bytes_read += self.available;
652        self.available = 0;
653        self.buffers.clear();
654        result
655    }
656
657    fn advance(&mut self, mut length: usize) -> Result<(), Errno> {
658        if length > self.available {
659            return error!(EINVAL);
660        }
661        self.available -= length;
662        self.bytes_read += length;
663        while let Some(mut buffer) = self.buffers.pop() {
664            if length < buffer.length {
665                buffer.advance(length)?;
666                self.buffers.push(buffer);
667                return Ok(());
668            }
669            length -= buffer.length;
670            if length == 0 {
671                return Ok(());
672            }
673        }
674        if length != 0 { error!(EINVAL) } else { Ok(()) }
675    }
676
677    fn available(&self) -> usize {
678        self.available
679    }
680    fn bytes_read(&self) -> usize {
681        self.bytes_read
682    }
683}
684
685/// An OutputBuffer that write data to an internal buffer.
686#[derive(Debug)]
687pub struct VecOutputBuffer {
688    buffer: Vec<u8>,
689    // Used to keep track of the requested capacity. `Vec::with_capacity` may
690    // allocate more than the requested capacity so we can't rely on
691    // `Vec::capacity` to return the expected capacity.
692    capacity: usize,
693}
694
695impl VecOutputBuffer {
696    pub fn new(capacity: usize) -> Self {
697        Self { buffer: Vec::with_capacity(capacity), capacity }
698    }
699
700    pub fn data(&self) -> &[u8] {
701        &self.buffer
702    }
703
704    pub fn reset(&mut self) {
705        self.buffer.truncate(0)
706    }
707}
708
709impl From<VecOutputBuffer> for Vec<u8> {
710    fn from(data: VecOutputBuffer) -> Self {
711        data.buffer
712    }
713}
714
715impl Buffer for VecOutputBuffer {
716    fn segments_count(&self) -> Result<usize, Errno> {
717        Ok(1)
718    }
719
720    fn peek_each_segment(
721        &mut self,
722        callback: &mut PeekBufferSegmentsCallback<'_>,
723    ) -> Result<(), Errno> {
724        let current_len = self.buffer.len();
725        let buffer = &mut self.buffer.spare_capacity_mut()[..self.capacity - current_len];
726        callback(&UserBuffer {
727            address: UserAddress::from(buffer.as_mut_ptr() as u64),
728            length: buffer.len(),
729        });
730
731        Ok(())
732    }
733}
734
735impl OutputBuffer for VecOutputBuffer {
736    fn write_each(&mut self, callback: &mut OutputBufferCallback<'_>) -> Result<usize, Errno> {
737        let current_len = self.buffer.len();
738        let written =
739            callback(&mut self.buffer.spare_capacity_mut()[..self.capacity - current_len])?;
740        if current_len + written > self.capacity {
741            return error!(EINVAL);
742        }
743        // SAFETY: the vector is now initialized for an extra `written` bytes.
744        unsafe { self.buffer.set_len(current_len + written) }
745        Ok(written)
746    }
747
748    fn available(&self) -> usize {
749        self.capacity - self.buffer.len()
750    }
751
752    fn bytes_written(&self) -> usize {
753        self.buffer.len()
754    }
755
756    fn zero(&mut self) -> Result<usize, Errno> {
757        let zeroed = self.capacity - self.buffer.len();
758        self.buffer.resize(self.capacity, 0);
759        Ok(zeroed)
760    }
761
762    unsafe fn advance(&mut self, length: usize) -> Result<(), Errno> {
763        if length > self.available() {
764            return error!(EINVAL);
765        }
766
767        self.capacity -= length;
768        let current_len = self.buffer.len();
769        // SAFETY: We checked that length <= self.available(), and we updated self.capacity.
770        // self.available() is self.capacity - self.buffer.len().
771        // So length <= self.capacity - self.buffer.len()
772        // self.buffer.len() + length <= self.capacity.
773        // The buffer has at least self.capacity capacity (see VecOutputBuffer::new).
774        unsafe { self.buffer.set_len(current_len + length) };
775        Ok(())
776    }
777}
778
779/// An InputBuffer that read data from an internal buffer.
780#[derive(Debug)]
781pub struct VecInputBuffer {
782    buffer: Vec<u8>,
783
784    // Invariant: `bytes_read <= buffer.len()` at all times.
785    bytes_read: usize,
786}
787
788impl VecInputBuffer {
789    pub fn new(buffer: &[u8]) -> Self {
790        Self { buffer: buffer.to_vec(), bytes_read: 0 }
791    }
792}
793
794impl From<Vec<u8>> for VecInputBuffer {
795    fn from(buffer: Vec<u8>) -> Self {
796        Self { buffer, bytes_read: 0 }
797    }
798}
799
800impl Buffer for VecInputBuffer {
801    fn segments_count(&self) -> Result<usize, Errno> {
802        Ok(1)
803    }
804
805    fn peek_each_segment(
806        &mut self,
807        callback: &mut PeekBufferSegmentsCallback<'_>,
808    ) -> Result<(), Errno> {
809        let buffer = &self.buffer[self.bytes_read..];
810        callback(&UserBuffer {
811            address: UserAddress::from(buffer.as_ptr() as u64),
812            length: buffer.len(),
813        });
814
815        Ok(())
816    }
817}
818
819impl InputBuffer for VecInputBuffer {
820    fn peek_each(&mut self, callback: &mut InputBufferCallback<'_>) -> Result<usize, Errno> {
821        let read = callback(&self.buffer[self.bytes_read..])?;
822        if self.bytes_read + read > self.buffer.len() {
823            return error!(EINVAL);
824        }
825        debug_assert!(self.bytes_read <= self.buffer.len());
826        Ok(read)
827    }
828    fn advance(&mut self, length: usize) -> Result<(), Errno> {
829        if length > self.buffer.len() {
830            return error!(EINVAL);
831        }
832        self.bytes_read += length;
833        debug_assert!(self.bytes_read <= self.buffer.len());
834        Ok(())
835    }
836    fn available(&self) -> usize {
837        self.buffer.len() - self.bytes_read
838    }
839    fn bytes_read(&self) -> usize {
840        self.bytes_read
841    }
842    fn drain(&mut self) -> usize {
843        let result = self.available();
844        self.bytes_read += result;
845        result
846    }
847}
848
849impl VecInputBuffer {
850    /// Read an object from userspace memory and increment the read position.
851    ///
852    /// Returns an error if there is not enough available bytes compared to the size of `T`.
853    pub fn read_object<T: FromBytes>(&mut self) -> Result<T, Errno> {
854        let size = std::mem::size_of::<T>();
855        let end = self.bytes_read + size;
856        if end > self.buffer.len() {
857            return error!(EINVAL);
858        }
859        let obj =
860            T::read_from_bytes(&self.buffer[self.bytes_read..end]).map_err(|_| errno!(EINVAL))?;
861        self.bytes_read = end;
862        debug_assert!(self.bytes_read <= self.buffer.len());
863        Ok(obj)
864    }
865}
866
867#[cfg(test)]
868mod tests {
869    use super::*;
870    use crate::mm::{MemoryAccessor as _, PAGE_SIZE};
871    use crate::testing::*;
872    use usercopy::slice_to_maybe_uninit_mut;
873
874    #[test]
875    fn test_data_input_buffer() {
876        let mut executor = fuchsia_async::TestExecutor::new();
877        executor.run_singlethreaded(async {
878            spawn_kernel_and_run(async |locked, current_task| {
879                let page_size = *PAGE_SIZE;
880                let addr =
881                    map_memory(locked, &current_task, UserAddress::default(), 64 * page_size);
882
883                let data: Vec<u8> = (0..1024).map(|i| (i % 256) as u8).collect();
884                let mm = current_task.deref();
885                mm.write_memory(addr, &data).expect("failed to write test data");
886
887                let input_iovec = smallvec![
888                    UserBuffer { address: addr, length: 25 },
889                    UserBuffer {
890                        address: (addr + 64usize).expect("Memory mapped OOB!"),
891                        length: 12
892                    },
893                ];
894
895                // Test incorrect callback.
896                {
897                    let mut input_buffer =
898                        UserBuffersInputBuffer::unified_new(mm, input_iovec.clone())
899                            .expect("UserBuffersInputBuffer");
900                    assert!(input_buffer.peek_each(&mut |data| Ok(data.len() + 1)).is_err());
901                }
902
903                // Test drain
904                {
905                    let mut input_buffer =
906                        UserBuffersInputBuffer::unified_new(mm, input_iovec.clone())
907                            .expect("UserBuffersInputBuffer");
908                    assert_eq!(input_buffer.available(), 37);
909                    assert_eq!(input_buffer.bytes_read(), 0);
910                    assert_eq!(input_buffer.drain(), 37);
911                    assert_eq!(input_buffer.available(), 0);
912                    assert_eq!(input_buffer.bytes_read(), 37);
913                }
914
915                // Test read_all
916                {
917                    let mut input_buffer =
918                        UserBuffersInputBuffer::unified_new(mm, input_iovec.clone())
919                            .expect("UserBuffersInputBuffer");
920                    assert_eq!(input_buffer.available(), 37);
921                    assert_eq!(input_buffer.bytes_read(), 0);
922                    let buffer = input_buffer.read_all().expect("read_all");
923                    assert_eq!(input_buffer.available(), 0);
924                    assert_eq!(input_buffer.bytes_read(), 37);
925                    assert_eq!(buffer.len(), 37);
926                    assert_eq!(&data[..25], &buffer[..25]);
927                    assert_eq!(&data[64..76], &buffer[25..37]);
928                }
929
930                // Test read
931                {
932                    let mut input_buffer = UserBuffersInputBuffer::unified_new(mm, input_iovec)
933                        .expect("UserBuffersInputBuffer");
934                    let mut buffer = [0; 50];
935                    assert_eq!(input_buffer.available(), 37);
936                    assert_eq!(input_buffer.bytes_read(), 0);
937                    assert_eq!(
938                        input_buffer
939                            .read_exact(slice_to_maybe_uninit_mut(&mut buffer[0..20]))
940                            .expect("read"),
941                        20
942                    );
943                    assert_eq!(input_buffer.available(), 17);
944                    assert_eq!(input_buffer.bytes_read(), 20);
945                    assert_eq!(
946                        input_buffer
947                            .read_exact(slice_to_maybe_uninit_mut(&mut buffer[20..37]))
948                            .expect("read"),
949                        17
950                    );
951                    assert!(
952                        input_buffer
953                            .read_exact(slice_to_maybe_uninit_mut(&mut buffer[37..]))
954                            .is_err()
955                    );
956                    assert_eq!(input_buffer.available(), 0);
957                    assert_eq!(input_buffer.bytes_read(), 37);
958                    assert_eq!(&data[..25], &buffer[..25]);
959                    assert_eq!(&data[64..76], &buffer[25..37]);
960                }
961            })
962            .await;
963        });
964    }
965
966    #[test]
967    fn test_data_output_buffer() {
968        let mut executor = fuchsia_async::TestExecutor::new();
969        executor.run_singlethreaded(async {
970            spawn_kernel_and_run(async |locked, current_task| {
971                let page_size = *PAGE_SIZE;
972                let addr =
973                    map_memory(locked, &current_task, UserAddress::default(), 64 * page_size);
974
975                let output_iovec = smallvec![
976                    UserBuffer { address: addr, length: 25 },
977                    UserBuffer {
978                        address: (addr + 64usize).expect("Memory was mapped OOB!"),
979                        length: 12
980                    },
981                ];
982
983                let mm = current_task.deref();
984                let data: Vec<u8> = (0..1024).map(|i| (i % 256) as u8).collect();
985
986                // Test incorrect callback.
987                {
988                    let mut output_buffer =
989                        UserBuffersOutputBuffer::unified_new(mm, output_iovec.clone())
990                            .expect("UserBuffersOutputBuffer");
991                    assert!(output_buffer.write_each(&mut |data| Ok(data.len() + 1)).is_err());
992                }
993
994                // Test write
995                {
996                    let mut output_buffer = UserBuffersOutputBuffer::unified_new(mm, output_iovec)
997                        .expect("UserBuffersOutputBuffer");
998                    assert_eq!(output_buffer.available(), 37);
999                    assert_eq!(output_buffer.bytes_written(), 0);
1000                    assert_eq!(output_buffer.write_all(&data[0..20]).expect("write"), 20);
1001                    assert_eq!(output_buffer.available(), 17);
1002                    assert_eq!(output_buffer.bytes_written(), 20);
1003                    assert_eq!(output_buffer.write_all(&data[20..37]).expect("write"), 17);
1004                    assert_eq!(output_buffer.available(), 0);
1005                    assert_eq!(output_buffer.bytes_written(), 37);
1006                    assert!(output_buffer.write_all(&data[37..50]).is_err());
1007
1008                    let buffer = current_task
1009                        .read_memory_to_array::<128>(addr)
1010                        .expect("failed to write test data");
1011                    assert_eq!(&data[0..25], &buffer[0..25]);
1012                    assert_eq!(&data[25..37], &buffer[64..76]);
1013                }
1014            })
1015            .await;
1016        });
1017    }
1018
1019    #[::fuchsia::test]
1020    fn test_vec_input_buffer() {
1021        let mut input_buffer = VecInputBuffer::new(b"helloworld");
1022        assert!(input_buffer.peek_each(&mut |data| Ok(data.len() + 1)).is_err());
1023
1024        let mut input_buffer = VecInputBuffer::new(b"helloworld");
1025        assert_eq!(input_buffer.bytes_read(), 0);
1026        assert_eq!(input_buffer.available(), 10);
1027        assert_eq!(input_buffer.drain(), 10);
1028        assert_eq!(input_buffer.bytes_read(), 10);
1029        assert_eq!(input_buffer.available(), 0);
1030
1031        let mut input_buffer = VecInputBuffer::new(b"helloworld");
1032        assert_eq!(input_buffer.bytes_read(), 0);
1033        assert_eq!(input_buffer.available(), 10);
1034        assert_eq!(&input_buffer.read_all().expect("read_all"), b"helloworld");
1035        assert_eq!(input_buffer.bytes_read(), 10);
1036        assert_eq!(input_buffer.available(), 0);
1037
1038        let mut input_buffer = VecInputBuffer::new(b"helloworld");
1039        let mut buffer = [0; 5];
1040        assert_eq!(
1041            input_buffer.read_exact(slice_to_maybe_uninit_mut(&mut buffer)).expect("read"),
1042            5
1043        );
1044        assert_eq!(input_buffer.bytes_read(), 5);
1045        assert_eq!(input_buffer.available(), 5);
1046        assert_eq!(&buffer, b"hello");
1047        assert_eq!(
1048            input_buffer.read_exact(slice_to_maybe_uninit_mut(&mut buffer)).expect("read"),
1049            5
1050        );
1051        assert_eq!(input_buffer.bytes_read(), 10);
1052        assert_eq!(input_buffer.available(), 0);
1053        assert_eq!(&buffer, b"world");
1054        assert!(input_buffer.read_exact(slice_to_maybe_uninit_mut(&mut buffer)).is_err());
1055
1056        // Test read_object
1057        let mut input_buffer = VecInputBuffer::new(b"hello");
1058        assert_eq!(input_buffer.bytes_read(), 0);
1059        let buffer: [u8; 3] = input_buffer.read_object().expect("read_object");
1060        assert_eq!(&buffer, b"hel");
1061        assert_eq!(input_buffer.bytes_read(), 3);
1062        let buffer: [u8; 2] = input_buffer.read_object().expect("read_object");
1063        assert_eq!(&buffer, b"lo");
1064        assert_eq!(input_buffer.bytes_read(), 5);
1065        assert!(input_buffer.read_object::<[u8; 1]>().is_err());
1066        assert_eq!(input_buffer.bytes_read(), 5);
1067
1068        let mut input_buffer = VecInputBuffer::new(b"hello");
1069        assert_eq!(input_buffer.bytes_read(), 0);
1070        assert!(input_buffer.read_object::<[u8; 100]>().is_err());
1071        assert_eq!(input_buffer.bytes_read(), 0);
1072    }
1073
1074    #[::fuchsia::test]
1075    fn test_vec_output_buffer() {
1076        let mut output_buffer = VecOutputBuffer::new(10);
1077        assert!(output_buffer.write_each(&mut |data| Ok(data.len() + 1)).is_err());
1078        assert_eq!(output_buffer.bytes_written(), 0);
1079        assert_eq!(output_buffer.available(), 10);
1080        assert_eq!(output_buffer.write_all(b"hello").expect("write"), 5);
1081        assert_eq!(output_buffer.bytes_written(), 5);
1082        assert_eq!(output_buffer.available(), 5);
1083        assert_eq!(output_buffer.data(), b"hello");
1084        assert_eq!(output_buffer.write_all(b"world").expect("write"), 5);
1085        assert_eq!(output_buffer.bytes_written(), 10);
1086        assert_eq!(output_buffer.available(), 0);
1087        assert_eq!(output_buffer.data(), b"helloworld");
1088        assert!(output_buffer.write_all(b"foo").is_err());
1089        let data: Vec<u8> = output_buffer.into();
1090        assert_eq!(data, b"helloworld".to_vec());
1091    }
1092
1093    #[::fuchsia::test]
1094    fn test_vec_write_buffer() {
1095        let mut input_buffer = VecInputBuffer::new(b"helloworld");
1096        let mut output_buffer = VecOutputBuffer::new(20);
1097        assert_eq!(output_buffer.write_buffer(&mut input_buffer).expect("write_buffer"), 10);
1098        assert_eq!(output_buffer.data(), b"helloworld");
1099    }
1100}