[web] confirm safety of advance
After further testing and checks I'm fairy confident that the vectored write code is safe. Signed-off-by: Ben Aaron Goldberg <ben@benaaron.dev>
This commit is contained in:
parent
63cfa014d5
commit
3a4afbcaea
|
@ -77,7 +77,9 @@ fn advance<'a>(buf: &mut IoSlice<'a>, n: usize) {
|
||||||
if buf.len() < n {
|
if buf.len() < n {
|
||||||
panic!("advancing IoSlice beyond its length");
|
panic!("advancing IoSlice beyond its length");
|
||||||
}
|
}
|
||||||
// SAFTEY: hopefully
|
// This is just a hacky way of advancing the pointer inside the IoSlice
|
||||||
|
// SAFTEY: The newly constructed IoSlice has the same lifetime as the old and
|
||||||
|
// this is guaranteed not to overflow the buffer due to the previous check
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut ptr = buf.as_ptr() as *mut u8;
|
let mut ptr = buf.as_ptr() as *mut u8;
|
||||||
ptr = ptr.add(n);
|
ptr = ptr.add(n);
|
||||||
|
@ -87,3 +89,17 @@ fn advance<'a>(buf: &mut IoSlice<'a>, n: usize) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_advance() {
|
||||||
|
let expected: Vec<_> = (10..100).collect();
|
||||||
|
let buf: Vec<_> = (0..100).collect();
|
||||||
|
let mut io_slice = IoSlice::new(&buf);
|
||||||
|
advance(&mut io_slice, 10);
|
||||||
|
assert_eq!(io_slice.len(), 90);
|
||||||
|
assert_eq!(&*io_slice, &expected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue