diff options
-rw-r--r-- | src/connection.rs | 8 | ||||
-rw-r--r-- | src/lib.rs | 12 |
2 files changed, 15 insertions, 5 deletions
diff --git a/src/connection.rs b/src/connection.rs index 602b169..c9d418f 100644 --- a/src/connection.rs +++ b/src/connection.rs @@ -17,7 +17,7 @@ use crate::log::{ensure_log_registered, rustls_log_callback}; use crate::rslice::rustls_str; use crate::{ box_castable, ffi_panic_boundary, free_box, try_callback, try_mut_from_ptr, try_ref_from_ptr, - try_slice, userdata_push, + try_slice, try_slice_mut, userdata_push, }; use rustls_result::NullParameter; @@ -491,7 +491,7 @@ impl rustls_connection { // Safety: the memory pointed at by buf must be initialized // (required by documentation of this function). - let read_buf = unsafe { slice::from_raw_parts_mut(buf, count) }; + let read_buf = try_slice_mut!(buf, count); let n_read = match conn.reader().read(read_buf) { Ok(n) => n, @@ -536,9 +536,7 @@ impl rustls_connection { if buf.is_null() || out_n.is_null() { return NullParameter; } - let read_buf = unsafe { slice::from_raw_parts_mut(buf, count) }; - - let mut read_buf: std::io::BorrowedBuf<'_> = read_buf.into(); + let mut read_buf: std::io::BorrowedBuf<'_> = try_slice_mut!(buf, count).into(); let n_read = match conn.reader().read_buf(read_buf.unfilled()) { Ok(()) => read_buf.filled().len(), @@ -679,6 +679,18 @@ macro_rules! try_slice { pub(crate) use try_slice; +macro_rules! try_slice_mut { + ( $ptr:expr, $count:expr ) => { + if $ptr.is_null() { + return $crate::panic::NullParameterOrDefault::value(); + } else { + unsafe { slice::from_raw_parts_mut($ptr, $count) } + } + }; +} + +pub(crate) use try_slice_mut; + macro_rules! try_callback { ( $var:ident ) => { match $var { |