diff --git a/uefi-test-runner/src/boot/mod.rs b/uefi-test-runner/src/boot/mod.rs index e8f55fe47..193f16dd9 100644 --- a/uefi-test-runner/src/boot/mod.rs +++ b/uefi-test-runner/src/boot/mod.rs @@ -3,6 +3,7 @@ use uefi::proto::console::text::Output; use uefi::proto::device_path::media::FilePath; use uefi::proto::device_path::{DevicePath, LoadedImageDevicePath}; use uefi::table::boot::{BootServices, LoadImageSource, SearchType}; +use uefi::table::boot::{OpenProtocolAttributes, OpenProtocolParams}; use uefi::table::{Boot, SystemTable}; use uefi::{CString16, Identify}; @@ -85,11 +86,24 @@ fn test_load_image(bt: &BootServices) { buffer: image_data.as_slice(), file_path: None, }; - let _ = bt + let loaded_image = bt .load_image(bt.image_handle(), load_source) .expect("should load image"); log::debug!("load_image with FromBuffer strategy works"); + + unsafe { + let _ = bt + .open_protocol::( + OpenProtocolParams { + handle: loaded_image, + agent: bt.image_handle(), + controller: None, + }, + OpenProtocolAttributes::GetProtocol, + ) + .expect("should open LoadedImageDevicePath protocol"); + } } // Variant B: FromDevicePath { diff --git a/uefi/src/proto/device_path/mod.rs b/uefi/src/proto/device_path/mod.rs index 9ec1097fa..0c80ef661 100644 --- a/uefi/src/proto/device_path/mod.rs +++ b/uefi/src/proto/device_path/mod.rs @@ -296,10 +296,12 @@ pub struct DevicePath { impl ProtocolPointer for DevicePath { unsafe fn ptr_from_ffi(ptr: *const c_void) -> *const Self { + assert!(!ptr.is_null()); ptr_meta::from_raw_parts(ptr.cast(), Self::size_in_bytes_from_ptr(ptr)) } unsafe fn mut_ptr_from_ffi(ptr: *mut c_void) -> *mut Self { + assert!(!ptr.is_null()); ptr_meta::from_raw_parts_mut(ptr.cast(), Self::size_in_bytes_from_ptr(ptr)) } } @@ -684,10 +686,12 @@ pub struct LoadedImageDevicePath(DevicePath); impl ProtocolPointer for LoadedImageDevicePath { unsafe fn ptr_from_ffi(ptr: *const c_void) -> *const Self { + assert!(!ptr.is_null()); ptr_meta::from_raw_parts(ptr.cast(), DevicePath::size_in_bytes_from_ptr(ptr)) } unsafe fn mut_ptr_from_ffi(ptr: *mut c_void) -> *mut Self { + assert!(!ptr.is_null()); ptr_meta::from_raw_parts_mut(ptr.cast(), DevicePath::size_in_bytes_from_ptr(ptr)) } } diff --git a/uefi/src/proto/mod.rs b/uefi/src/proto/mod.rs index 71d7530dd..fd0a01bd0 100644 --- a/uefi/src/proto/mod.rs +++ b/uefi/src/proto/mod.rs @@ -56,10 +56,12 @@ where P: Protocol, { unsafe fn ptr_from_ffi(ptr: *const c_void) -> *const Self { + assert!(!ptr.is_null()); ptr.cast::() } unsafe fn mut_ptr_from_ffi(ptr: *mut c_void) -> *mut Self { + assert!(!ptr.is_null()); ptr.cast::() } }