diff options
| author | EliseZeroTwo <mail@elise.moe> | 2022-01-22 13:42:56 +0100 |
|---|---|---|
| committer | Kyle Martin <krm504@nyu.edu> | 2022-04-12 16:50:08 -0400 |
| commit | 2278cfa7fa39c37e54ebc2c02ca81eba135b3b09 (patch) | |
| tree | e487cb48dcb61d060fe6227fec8495f0f431bcde /rust | |
| parent | 9c73b5f2b3f3963bb75ddb602ab5d6985df7ce93 (diff) | |
fix: CustomViewContext using 'std::mem::zeroed' which can result in runtime panics when called on certain types in newer versions of Rust
Diffstat (limited to 'rust')
| -rw-r--r-- | rust/src/custombinaryview.rs | 71 |
1 files changed, 41 insertions, 30 deletions
diff --git a/rust/src/custombinaryview.rs b/rust/src/custombinaryview.rs index 645f5fd4..3afc6dc6 100644 --- a/rust/src/custombinaryview.rs +++ b/rust/src/custombinaryview.rs @@ -373,7 +373,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { where V: CustomBinaryView, { - view: V, + view: mem::MaybeUninit<V>, raw_handle: *mut BNBinaryView, initialized: bool, args: V::Args, @@ -387,19 +387,27 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { let context = &mut *(ctxt as *mut CustomViewContext<V>); let handle = BinaryView::from_raw(context.raw_handle); - if let Ok(v) = V::new(handle.as_ref(), &context.args) { - ptr::write(&mut context.view, v); - context.initialized = true; + match V::new(handle.as_ref(), &context.args) { + Ok(v) => { + ptr::write(&mut context.view, mem::MaybeUninit::new(v)); + context.initialized = true; - if context.view.init(ptr::read(&context.args)).is_ok() { - true - } else { - error!("CustomBinaryView::init failed; custom view returned Err"); + match context + .view + .assume_init_ref() + .init(ptr::read(&context.args)) + { + Ok(_) => true, + Err(_) => { + error!("CustomBinaryView::init failed; custom view returned Err"); + false + } + } + } + Err(_) => { + error!("CustomBinaryView::new failed; custom view returned Err"); false } - } else { - error!("CustomBinaryView::new failed; custom view returned Err"); - false } }) } @@ -469,7 +477,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { let context = &*(ctxt as *mut CustomViewContext<V>); let dest = slice::from_raw_parts_mut(dest as *mut u8, len); - context.view.read(dest, offset) + context.view.assume_init_ref().read(dest, offset) }) } @@ -486,7 +494,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { let context = &*(ctxt as *mut CustomViewContext<V>); let src = slice::from_raw_parts(src as *const u8, len); - context.view.write(offset, src) + context.view.assume_init_ref().write(offset, src) }) } @@ -503,7 +511,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { let context = &*(ctxt as *mut CustomViewContext<V>); let src = slice::from_raw_parts(src as *const u8, len); - context.view.insert(offset, src) + context.view.assume_init_ref().insert(offset, src) }) } @@ -514,7 +522,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::remove", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.remove(offset, len as usize) + context.view.assume_init_ref().remove(offset, len as usize) }) } @@ -525,7 +533,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::modification_status", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.modification_status(offset) + context.view.assume_init_ref().modification_status(offset) }) } @@ -536,7 +544,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::offset_valid", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.offset_valid(offset) + context.view.assume_init_ref().offset_valid(offset) }) } @@ -547,7 +555,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::readable", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.offset_readable(offset) + context.view.assume_init_ref().offset_readable(offset) }) } @@ -558,7 +566,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::writable", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.offset_writable(offset) + context.view.assume_init_ref().offset_writable(offset) }) } @@ -569,7 +577,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::offset_executable", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.offset_executable(offset) + context.view.assume_init_ref().offset_executable(offset) }) } @@ -580,7 +588,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::offset_backed_by_file", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.offset_backed_by_file(offset) + context.view.assume_init_ref().offset_backed_by_file(offset) }) } @@ -591,7 +599,10 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::next_valid_offset_after", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.next_valid_offset_after(offset) + context + .view + .assume_init_ref() + .next_valid_offset_after(offset) }) } @@ -602,7 +613,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::start", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.start() + context.view.assume_init_ref().start() }) } @@ -613,7 +624,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::len", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.len() as u64 + context.view.assume_init_ref().len() as u64 }) } @@ -624,7 +635,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::entry_point", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.entry_point() + context.view.assume_init_ref().entry_point() }) } @@ -635,7 +646,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::executable", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.executable() + context.view.assume_init_ref().executable() }) } @@ -646,7 +657,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::default_endianness", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.default_endianness() + context.view.assume_init_ref().default_endianness() }) } @@ -657,7 +668,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::relocatable", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.relocatable() + context.view.assume_init_ref().relocatable() }) } @@ -668,7 +679,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { ffi_wrap!("BinaryViewBase::address_size", unsafe { let context = &*(ctxt as *mut CustomViewContext<V>); - context.view.address_size() + context.view.assume_init_ref().address_size() }) } @@ -683,7 +694,7 @@ impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { } let ctxt = Box::new(CustomViewContext::<V> { - view: unsafe { mem::zeroed() }, + view: mem::MaybeUninit::uninit(), raw_handle: ptr::null_mut(), initialized: false, args: view_args, |
