Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- libs/vkd3d-shader/dxbc.c | 4 ++-- libs/vkd3d-shader/vkd3d_shader_main.c | 20 +++++++++++++------- libs/vkd3d-shader/vkd3d_shader_private.h | 3 ++- 3 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c index 93e7eaf5..3ddca1e9 100644 --- a/libs/vkd3d-shader/dxbc.c +++ b/libs/vkd3d-shader/dxbc.c @@ -2786,7 +2786,7 @@ int vkd3d_shader_parse_root_signature(const struct vkd3d_shader_code *dxbc,
ret = parse_dxbc(dxbc->code, dxbc->size, &message_context, rts0_handler, root_signature); vkd3d_shader_message_context_trace_messages(&message_context); - if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&message_context))) + if (!vkd3d_shader_message_context_copy_messages(&message_context, messages)) ret = VKD3D_ERROR_OUT_OF_MEMORY;
vkd3d_shader_message_context_cleanup(&message_context); @@ -3390,7 +3390,7 @@ int vkd3d_shader_serialize_root_signature(const struct vkd3d_shader_versioned_ro
done: vkd3d_shader_message_context_trace_messages(&context.message_context); - if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&context.message_context))) + if (!vkd3d_shader_message_context_copy_messages(&context.message_context, messages)) ret = VKD3D_ERROR_OUT_OF_MEMORY; vkd3d_shader_message_context_cleanup(&context.message_context); return ret; diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c index c2fe2c8e..d3d86ed7 100644 --- a/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d-shader/vkd3d_shader_main.c @@ -140,14 +140,20 @@ void vkd3d_shader_message_context_trace_messages_(const struct vkd3d_shader_mess vkd3d_string_buffer_trace_(&context->messages, function); }
-char *vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context) +bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context, char **out) { char *messages;
- if ((messages = vkd3d_malloc(context->messages.content_size + 1))) - memcpy(messages, context->messages.buffer, context->messages.content_size + 1); + if (!out) + return true;
- return messages; + *out = NULL; + + if (!(messages = vkd3d_malloc(context->messages.content_size + 1))) + return false; + memcpy(messages, context->messages.buffer, context->messages.content_size + 1); + *out = messages; + return true; }
void vkd3d_shader_verror(struct vkd3d_shader_message_context *context, @@ -842,7 +848,7 @@ int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char ret = scan_dxbc(compile_info, &message_context);
vkd3d_shader_message_context_trace_messages(&message_context); - if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&message_context))) + if (!vkd3d_shader_message_context_copy_messages(&message_context, messages)) ret = VKD3D_ERROR_OUT_OF_MEMORY; vkd3d_shader_message_context_cleanup(&message_context); return ret; @@ -956,7 +962,7 @@ int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info, }
vkd3d_shader_message_context_trace_messages(&message_context); - if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&message_context))) + if (!vkd3d_shader_message_context_copy_messages(&message_context, messages)) ret = VKD3D_ERROR_OUT_OF_MEMORY; vkd3d_shader_message_context_cleanup(&message_context); return ret; @@ -1046,7 +1052,7 @@ int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
ret = shader_parse_input_signature(dxbc->code, dxbc->size, &message_context, signature); vkd3d_shader_message_context_trace_messages(&message_context); - if (messages && !(*messages = vkd3d_shader_message_context_copy_messages(&message_context))) + if (!vkd3d_shader_message_context_copy_messages(&message_context, messages)) ret = VKD3D_ERROR_OUT_OF_MEMORY;
vkd3d_shader_message_context_cleanup(&message_context); diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index f88ea69a..98b5fbc4 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -848,7 +848,8 @@ struct vkd3d_shader_message_context };
void vkd3d_shader_message_context_cleanup(struct vkd3d_shader_message_context *context) DECLSPEC_HIDDEN; -char *vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context) DECLSPEC_HIDDEN; +bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context, + char **out) DECLSPEC_HIDDEN; bool vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context, enum vkd3d_shader_log_level log_level, const char *source_name) DECLSPEC_HIDDEN; void vkd3d_shader_message_context_trace_messages_(const struct vkd3d_shader_message_context *context,