summaryrefslogtreecommitdiff
path: root/backends
diff options
context:
space:
mode:
authorOliver Steffen <osteffen@redhat.com>2026-02-12 16:41:14 +0100
committerGerd Hoffmann <kraxel@redhat.com>2026-02-17 16:02:57 +0100
commit03025db6a0ad18d3a8d1a8093f53ae6d76a9d4b3 (patch)
treeb2d98e3a70e12551ab366421dd78673a2783f5c5 /backends
parentece408818d27f745ef1b05fb3cc99a1e7a5bf580 (diff)
downloadqemu-03025db6a0ad18d3a8d1a8093f53ae6d76a9d4b3.tar.gz
qemu-03025db6a0ad18d3a8d1a8093f53ae6d76a9d4b3.zip
igvm: Add NULL checks for igvm_get_buffer()
According to the documentation we are supposed to do a null-pointer check on the buffers returned by igvm_get_buffer() (part of the IGVM C library). Add these checks in the IGVM backend. Signed-off-by: Oliver Steffen <osteffen@redhat.com> Reviewed-by: Luigi Leonardi <leonardi@redhat.com> Message-ID: <20260212154114.1119944-1-osteffen@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'backends')
-rw-r--r--backends/igvm.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/backends/igvm.c b/backends/igvm.c
index b01a19ba46..3b5edf1521 100644
--- a/backends/igvm.c
+++ b/backends/igvm.c
@@ -152,9 +152,17 @@ static int qigvm_handler(QIgvm *ctx, uint32_t type, Error **errp)
(int)header_handle);
return -1;
}
- header_data = igvm_get_buffer(ctx->file, header_handle) +
- sizeof(IGVM_VHS_VARIABLE_HEADER);
- result = handlers[handler].handler(ctx, header_data, errp);
+ header_data = igvm_get_buffer(ctx->file, header_handle);
+ if (header_data != NULL) {
+ header_data += sizeof(IGVM_VHS_VARIABLE_HEADER);
+ result = handlers[handler].handler(ctx, header_data, errp);
+ } else {
+ error_setg(errp,
+ "IGVM: No buffer for handle %d: "
+ "(type 0x%X)",
+ header_handle, type);
+ result = -1;
+ }
igvm_free_buffer(ctx->file, header_handle);
return result;
}
@@ -316,6 +324,11 @@ static int qigvm_process_mem_region(QIgvm *ctx, unsigned start_index,
return -1;
}
data = igvm_get_buffer(ctx->file, data_handle);
+ if (data == NULL) {
+ error_setg(errp, "IGVM: No buffer for handle %d", data_handle);
+ igvm_free_buffer(ctx->file, data_handle);
+ return -1;
+ }
memcpy(&region[page_index * page_size], data, data_size);
igvm_free_buffer(ctx->file, data_handle);
}
@@ -426,6 +439,11 @@ static int qigvm_directive_vp_context(QIgvm *ctx, const uint8_t *header_data,
}
data = (uint8_t *)igvm_get_buffer(ctx->file, data_handle);
+ if (data == NULL) {
+ error_setg(errp, "IGVM: No buffer for handle %d", data_handle);
+ result = -1;
+ goto exit;
+ }
if (ctx->machine_state->cgs) {
result = ctx->cgsc->set_guest_state(
@@ -441,6 +459,7 @@ static int qigvm_directive_vp_context(QIgvm *ctx, const uint8_t *header_data,
result = -1;
}
+exit:
igvm_free_buffer(ctx->file, data_handle);
if (result < 0) {
return result;
@@ -778,9 +797,15 @@ static int qigvm_supported_platform_compat_mask(QIgvm *ctx, Error **errp)
}
platform =
(IGVM_VHS_SUPPORTED_PLATFORM *)(igvm_get_buffer(ctx->file,
- header_handle) +
- sizeof(
- IGVM_VHS_VARIABLE_HEADER));
+ header_handle));
+ if (platform == NULL) {
+ error_setg(errp, "IGVM: No buffer for handle %d", header_handle);
+ igvm_free_buffer(ctx->file, header_handle);
+ return -1;
+ }
+
+ platform = (IGVM_VHS_SUPPORTED_PLATFORM *)((void *)platform
+ + sizeof(IGVM_VHS_VARIABLE_HEADER));
if ((platform->platform_type == IGVM_PLATFORM_TYPE_SEV_ES) &&
ctx->machine_state->cgs) {
if (ctx->cgsc->check_support(