From 570b5548940b44f4c3f9299f72435073fa1024b9 Mon Sep 17 00:00:00 2001 From: Marijn Suijten Date: Thu, 6 Jan 2022 00:17:32 +0100 Subject: [PATCH] Assert that Vulkan array-getters return the same length (#534) Originally introduced in [#489] this inserts the array-length equality check everywhere else: in the supposedly invalid and inexistant event where Vulkan suddenly returns less items (`count` has been modified) than were originally queried through respective `_len()` functions (or more likely: a slice of invalid length passed by the user) and some elements at the end of the slice are left uninitialized, panic. Wherever there is valid concern or possibility for this to happen - or to circumvent assertions and panics altogether - mutable references to mutable slices should be passed allowing the length to be promptly updated. [#489]: https://github.com/MaikKlein/ash/pull/489#discussion_r753020089 --- ash/src/device.rs | 1 + .../extensions/khr/get_memory_requirements2.rs | 1 + .../khr/get_physical_device_properties2.rs | 2 ++ .../khr/get_surface_capabilities2.rs | 2 +- ash/src/extensions/khr/maintenance4.rs | 2 +- ash/src/instance.rs | 18 +++++++++++------- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/ash/src/device.rs b/ash/src/device.rs index 426fa1607..0093e4462 100644 --- a/ash/src/device.rs +++ b/ash/src/device.rs @@ -328,6 +328,7 @@ impl Device { &mut count, out.as_mut_ptr(), ); + assert_eq!(count as usize, out.len()); } #[doc = ""] diff --git a/ash/src/extensions/khr/get_memory_requirements2.rs b/ash/src/extensions/khr/get_memory_requirements2.rs index dc15119dc..8b2547d8f 100644 --- a/ash/src/extensions/khr/get_memory_requirements2.rs +++ b/ash/src/extensions/khr/get_memory_requirements2.rs @@ -70,6 +70,7 @@ impl GetMemoryRequirements2 { &mut count, out.as_mut_ptr(), ); + assert_eq!(count as usize, out.len()); } pub fn name() -> &'static CStr { diff --git a/ash/src/extensions/khr/get_physical_device_properties2.rs b/ash/src/extensions/khr/get_physical_device_properties2.rs index 268d67de1..29d17fd1b 100644 --- a/ash/src/extensions/khr/get_physical_device_properties2.rs +++ b/ash/src/extensions/khr/get_physical_device_properties2.rs @@ -107,6 +107,7 @@ impl GetPhysicalDeviceProperties2 { &mut count, out.as_mut_ptr(), ); + assert_eq!(count as usize, out.len()); } /// Retrieve the number of elements to pass to [`Self::get_physical_device_sparse_image_format_properties2()`] @@ -144,6 +145,7 @@ impl GetPhysicalDeviceProperties2 { &mut count, out.as_mut_ptr(), ); + assert_eq!(count as usize, out.len()); } pub fn name() -> &'static CStr { diff --git a/ash/src/extensions/khr/get_surface_capabilities2.rs b/ash/src/extensions/khr/get_surface_capabilities2.rs index 8c93219cb..683013b8f 100644 --- a/ash/src/extensions/khr/get_surface_capabilities2.rs +++ b/ash/src/extensions/khr/get_surface_capabilities2.rs @@ -66,7 +66,7 @@ impl GetSurfaceCapabilities2 { &mut count, out.as_mut_ptr(), ); - assert_eq!(count, out.len() as u32); + assert_eq!(count as usize, out.len()); err_code.result() } diff --git a/ash/src/extensions/khr/maintenance4.rs b/ash/src/extensions/khr/maintenance4.rs index 5f234e06d..a3f606fff 100644 --- a/ash/src/extensions/khr/maintenance4.rs +++ b/ash/src/extensions/khr/maintenance4.rs @@ -69,7 +69,7 @@ impl Maintenance4 { &mut count, out.as_mut_ptr(), ); - assert_eq!(count, out.len() as u32); + assert_eq!(count as usize, out.len()); } pub fn name() -> &'static CStr { diff --git a/ash/src/instance.rs b/ash/src/instance.rs index 1ea464ea9..87064c7c6 100644 --- a/ash/src/instance.rs +++ b/ash/src/instance.rs @@ -67,10 +67,12 @@ impl Instance { &self, out: &mut [vk::PhysicalDeviceGroupProperties], ) -> VkResult<()> { - let mut group_count = out.len() as u32; + let mut count = out.len() as u32; self.instance_fn_1_1 - .enumerate_physical_device_groups(self.handle(), &mut group_count, out.as_mut_ptr()) - .result() + .enumerate_physical_device_groups(self.handle(), &mut count, out.as_mut_ptr()) + .result()?; + assert_eq!(count as usize, out.len()); + Ok(()) } #[doc = ""] @@ -144,13 +146,14 @@ impl Instance { physical_device: vk::PhysicalDevice, out: &mut [vk::QueueFamilyProperties2], ) { - let mut queue_count = out.len() as u32; + let mut count = out.len() as u32; self.instance_fn_1_1 .get_physical_device_queue_family_properties2( physical_device, - &mut queue_count, + &mut count, out.as_mut_ptr(), ); + assert_eq!(count as usize, out.len()); } #[doc = ""] @@ -190,14 +193,15 @@ impl Instance { format_info: &vk::PhysicalDeviceSparseImageFormatInfo2, out: &mut [vk::SparseImageFormatProperties2], ) { - let mut format_count = out.len() as u32; + let mut count = out.len() as u32; self.instance_fn_1_1 .get_physical_device_sparse_image_format_properties2( physical_device, format_info, - &mut format_count, + &mut count, out.as_mut_ptr(), ); + assert_eq!(count as usize, out.len()); } #[doc = ""]