summaryrefslogtreecommitdiff
path: root/rust/src
diff options
context:
space:
mode:
authorEliseZeroTwo <mail@elise.moe>2022-01-22 13:42:56 +0100
committerKyle Martin <krm504@nyu.edu>2022-04-12 16:50:08 -0400
commit2278cfa7fa39c37e54ebc2c02ca81eba135b3b09 (patch)
treee487cb48dcb61d060fe6227fec8495f0f431bcde /rust/src
parent9c73b5f2b3f3963bb75ddb602ab5d6985df7ce93 (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/src')
-rw-r--r--rust/src/custombinaryview.rs71
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,