segfaulting: DebugUtilsMessengerCallbackDataEXT::pMessageIdName may be null in debug callback (#1487)

* vulkano: DebugUtilsMessengerCallbackDataEXT::pMessageIdName may be null in debug callback

- https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkDebugUtilsMessengerCallbackDataEXT.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessageIdName-parameter

* make `Message::layer_prefix` an Option
This commit is contained in:
Philipp Renoth 2021-02-10 22:39:15 +01:00 committed by GitHub
parent ff1dd87a32
commit e66e9a1fa2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 6 deletions

View File

@ -1,5 +1,6 @@
# Unreleased # Unreleased
- **Breaking** `Message::layer_prefix` turned to Option to prevent segfaults when Vulkan message didn't provide `pMessageIdName` value
- **Breaking** On `AutoCommandBufferBuilder`, methods that bind a descriptor set now take a `dynamic_offsets` parameter - **Breaking** On `AutoCommandBufferBuilder`, methods that bind a descriptor set now take a `dynamic_offsets` parameter
- **Breaking** On `AutoCommandBufferBuilder` and `SyncCommandBufferBuilder`, the `update_buffer` method now takes `data` by reference - **Breaking** On `AutoCommandBufferBuilder` and `SyncCommandBufferBuilder`, the `update_buffer` method now takes `data` by reference
- **Breaking** Made `PipelineLayoutDescTweaks` public, for use with compute pipelines - **Breaking** Made `PipelineLayoutDescTweaks` public, for use with compute pipelines

View File

@ -99,7 +99,10 @@ fn main() {
println!( println!(
"{} {} {}: {}", "{} {} {}: {}",
msg.layer_prefix, ty, severity, msg.description msg.layer_prefix.unwrap_or("unknown"),
ty,
severity,
msg.description
); );
}) })
.ok(); .ok();

View File

@ -96,9 +96,12 @@ impl DebugCallback {
let user_callback = user_data as *mut Box<dyn Fn()> as *const _; let user_callback = user_data as *mut Box<dyn Fn()> as *const _;
let user_callback: &Box<dyn Fn(&Message)> = &*user_callback; let user_callback: &Box<dyn Fn(&Message)> = &*user_callback;
let layer_prefix = CStr::from_ptr((*callback_data).pMessageIdName) let layer_prefix = (*callback_data).pMessageIdName.as_ref().map(|msg_id_name| {
.to_str() CStr::from_ptr(msg_id_name)
.expect("debug callback message not utf-8"); .to_str()
.expect("debug callback message not utf-8")
});
let description = CStr::from_ptr((*callback_data).pMessage) let description = CStr::from_ptr((*callback_data).pMessage)
.to_str() .to_str()
.expect("debug callback message not utf-8"); .expect("debug callback message not utf-8");
@ -231,8 +234,8 @@ pub struct Message<'a> {
pub severity: MessageSeverity, pub severity: MessageSeverity,
/// Type of message, /// Type of message,
pub ty: MessageType, pub ty: MessageType,
/// Prefix of the layer that reported this message. /// Prefix of the layer that reported this message or `None` if unknown.
pub layer_prefix: &'a str, pub layer_prefix: Option<&'a str>,
/// Description of the message. /// Description of the message.
pub description: &'a str, pub description: &'a str,
} }