* [PATCH v2 0/2] igvm: fix byte_offset handling in parameter directives
@ 2026-09-04 11:42 Luigi Leonardi
2026-09-04 11:42 ` [PATCH v2 1/2] igvm: validate byte_offset before using it " Luigi Leonardi
2026-09-04 11:42 ` [PATCH v2 2/2] igvm: honor byte_offset when writing memory map, MADT and device tree Luigi Leonardi
0 siblings, 2 replies; 5+ messages in thread
From: Luigi Leonardi @ 2026-09-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann, Stefano Garzarella, Ani Sinha, Luigi Leonardi
Several IGVM directives (memory map, vp-count, environment info, MADT,
device tree) _can_ place their data at a byte_offset within a shared
parameter area, letting multiple parameters be packed into one area.
Patch 1 introduces qigvm_find_param_validate(), which looks up a
parameter area and validates that byte_offset falls within it in one
step, and uses it in the vp-count and environment-info handlers, which
already relied on byte_offset.
Patch 2 fixes the memory map, MADT and device tree handlers, which
ignored byte_offset entirely and always wrote at the start of the
buffer, potentially corrupting earlier data when several parameters
share an area.
Signed-off-by: Luigi Leonardi <leonardi@redhat.com>
---
Changes in v2:
- Inverted commit order: first I introduce the helper and use it where
necessary, then in commit 2 I handle the `offset`. [Stefano]
- The helper now returns data and size, that already consider the byte
offset [Stefano]
- Link to v1: https://lore.kernel.org/qemu-devel/20260902-fix_offset-v1-0-04b18f7595b2@redhat.com
---
Luigi Leonardi (2):
igvm: validate byte_offset before using it in parameter directives
igvm: honor byte_offset when writing memory map, MADT and device tree
backends/igvm.c | 92 +++++++++++++++++++++++++++++++-----------
include/system/igvm-internal.h | 6 +++
target/i386/igvm.c | 12 +++---
3 files changed, 81 insertions(+), 29 deletions(-)
---
base-commit: d2e570cc0f97b936902a5b1b86b73c0f5998b475
change-id: 20260902-fix_offset-a268cb12aafc
Best regards,
--
Luigi Leonardi <leonardi@redhat.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/2] igvm: validate byte_offset before using it in parameter directives
2026-09-04 11:42 [PATCH v2 0/2] igvm: fix byte_offset handling in parameter directives Luigi Leonardi
@ 2026-09-04 11:42 ` Luigi Leonardi
2026-09-04 12:55 ` Stefano Garzarella
2026-09-04 11:42 ` [PATCH v2 2/2] igvm: honor byte_offset when writing memory map, MADT and device tree Luigi Leonardi
1 sibling, 1 reply; 5+ messages in thread
From: Luigi Leonardi @ 2026-09-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann, Stefano Garzarella, Ani Sinha, Luigi Leonardi
None of the directive handlers that place data at a byte_offset within
a parameter area validated that byte_offset actually falls within the
parameter area's size. A malformed IGVM file with byte_offset > size would
underflow the "size - byte_offset" computation used to determine
remaining space, wrapping to a huge value and defeating the size
check, then write out of bounds through param_entry->data +
byte_offset.
Add qigvm_find_param_validate(), which looks up the parameter area,
checks byte_offset against its size, and returns the offset-adjusted
data pointer and remaining size via output parameters instead of the
raw QIgvmParameterData entry. This keeps the byte_offset arithmetic in
one place instead of repeating param_entry->data + byte_offset and
param_entry->size - byte_offset at every call site.
Use it in the vp-count and environment-info handlers, adding an
explicit check that the fixed-size write fits in the remaining space.
Signed-off-by: Luigi Leonardi <leonardi@redhat.com>
---
backends/igvm.c | 68 +++++++++++++++++++++++++++++++++++-------
include/system/igvm-internal.h | 6 ++++
2 files changed, 63 insertions(+), 11 deletions(-)
diff --git a/backends/igvm.c b/backends/igvm.c
index 7b7bdc72b7..8c07f2ce5e 100644
--- a/backends/igvm.c
+++ b/backends/igvm.c
@@ -101,6 +101,39 @@ qigvm_find_param_entry(QIgvm *igvm, uint32_t parameter_area_index,
return NULL;
}
+/*
+ * Look up a parameter area and check that param->byte_offset falls within
+ * it, in one step. On success, *data and *size are set to the
+ * offset-adjusted write location and remaining space within the parameter
+ * area, so callers never need to touch param->byte_offset themselves.
+ */
+bool
+qigvm_find_param_validate(QIgvm *igvm, uint32_t parameter_area_index,
+ const IGVM_VHS_PARAMETER *param,
+ uint8_t **data, uint32_t *size,
+ Error **errp)
+{
+ QIgvmParameterData *param_entry;
+
+ assert(data && size);
+
+ param_entry = qigvm_find_param_entry(igvm, parameter_area_index, errp);
+ if (!param_entry) {
+ return false;
+ }
+
+ if (param->byte_offset > param_entry->size) {
+ error_setg(errp,
+ "IGVM: byte_offset 0x%x exceeds parameter area size 0x%x",
+ param->byte_offset, param_entry->size);
+ return false;
+ }
+
+ *data = param_entry->data + param->byte_offset;
+ *size = param_entry->size - param->byte_offset;
+ return true;
+}
+
static int qigvm_directive_page_data(QIgvm *ctx, const uint8_t *header_data,
Error **errp);
static int qigvm_directive_vp_context(QIgvm *ctx, const uint8_t *header_data,
@@ -682,17 +715,24 @@ static int qigvm_directive_vp_count(QIgvm *ctx, const uint8_t *header_data,
Error **errp)
{
const IGVM_VHS_PARAMETER *param = (const IGVM_VHS_PARAMETER *)header_data;
- QIgvmParameterData *param_entry;
+ uint8_t *data;
+ uint32_t size;
uint32_t *vp_count;
CPUState *cpu;
- param_entry = qigvm_find_param_entry(ctx,
- param->parameter_area_index, errp);
- if (param_entry == NULL) {
+ if (!qigvm_find_param_validate(ctx, param->parameter_area_index, param,
+ &data, &size, errp)) {
+ return -1;
+ }
+
+ if (sizeof(*vp_count) > size) {
+ error_setg(errp,
+ "IGVM: vp-count parameter exceeds parameter area "
+ "defined in IGVM file");
return -1;
}
- vp_count = (uint32_t *)(param_entry->data + param->byte_offset);
+ vp_count = (uint32_t *)data;
*vp_count = 0;
CPU_FOREACH(cpu)
{
@@ -707,17 +747,23 @@ static int qigvm_directive_environment_info(QIgvm *ctx,
Error **errp)
{
const IGVM_VHS_PARAMETER *param = (const IGVM_VHS_PARAMETER *)header_data;
- QIgvmParameterData *param_entry;
+ uint8_t *data;
+ uint32_t size;
IgvmEnvironmentInfo *environmental_state;
- param_entry = qigvm_find_param_entry(ctx,
- param->parameter_area_index, errp);
- if (param_entry == NULL) {
+ if (!qigvm_find_param_validate(ctx, param->parameter_area_index, param,
+ &data, &size, errp)) {
+ return -1;
+ }
+
+ if (sizeof(*environmental_state) > size) {
+ error_setg(errp,
+ "IGVM: environment-info parameter exceeds parameter area "
+ "defined in IGVM file");
return -1;
}
- environmental_state =
- (IgvmEnvironmentInfo *)(param_entry->data + param->byte_offset);
+ environmental_state = (IgvmEnvironmentInfo *)data;
environmental_state->memory_is_shared = 1;
return 0;
diff --git a/include/system/igvm-internal.h b/include/system/igvm-internal.h
index 9e9fa1d9af..6526b5055c 100644
--- a/include/system/igvm-internal.h
+++ b/include/system/igvm-internal.h
@@ -81,4 +81,10 @@ QIgvmParameterData*
qigvm_find_param_entry(QIgvm *igvm, uint32_t parameter_area_index,
Error **errp);
+bool
+qigvm_find_param_validate(QIgvm *igvm, uint32_t parameter_area_index,
+ const IGVM_VHS_PARAMETER *param,
+ uint8_t **data, uint32_t *size,
+ Error **errp);
+
#endif
--
2.55.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] igvm: honor byte_offset when writing memory map, MADT and device tree
2026-09-04 11:42 [PATCH v2 0/2] igvm: fix byte_offset handling in parameter directives Luigi Leonardi
2026-09-04 11:42 ` [PATCH v2 1/2] igvm: validate byte_offset before using it " Luigi Leonardi
@ 2026-09-04 11:42 ` Luigi Leonardi
2026-09-04 13:02 ` Stefano Garzarella
1 sibling, 1 reply; 5+ messages in thread
From: Luigi Leonardi @ 2026-09-04 11:42 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann, Stefano Garzarella, Ani Sinha, Luigi Leonardi
qigvm_directive_memory_map(), qigvm_directive_madt() and
qigvm_directive_device_tree() all wrote their data unconditionally at
the start of the parameter area's buffer, ignoring param->byte_offset
from the IGVM_VHS_PARAMETER header. This is harmless when a
directive's offset happens to be 0, but breaks for IGVM files that pack
multiple parameters into a single shared parameter area at different
offsets: a later directive would overwrite the data written by an earlier
one at the start of the buffer, corrupting it.
Switch these handlers to qigvm_find_param_validate(), introduced in
the previous patch, and use the offset-adjusted data pointer and
remaining size it returns instead of writing at param_entry->data and
sizing checks against param_entry->size directly. This both honors
byte_offset and validates it against the parameter area size before
it is used.
Signed-off-by: Luigi Leonardi <leonardi@redhat.com>
---
backends/igvm.c | 24 ++++++++++++------------
target/i386/igvm.c | 12 ++++++------
2 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/backends/igvm.c b/backends/igvm.c
index 8c07f2ce5e..4d622eac6a 100644
--- a/backends/igvm.c
+++ b/backends/igvm.c
@@ -638,7 +638,8 @@ static int qigvm_directive_memory_map(QIgvm *ctx, const uint8_t *header_data,
const IGVM_VHS_PARAMETER *param = (const IGVM_VHS_PARAMETER *)header_data;
int (*get_mem_map_entry)(int index, ConfidentialGuestMemoryMapEntry *entry,
Error **errp) = NULL;
- QIgvmParameterData *param_entry;
+ uint8_t *data;
+ uint32_t size;
int max_entry_count;
int entry = 0;
IGVM_VHS_MEMORY_MAP_ENTRY *mm_entry;
@@ -659,14 +660,13 @@ static int qigvm_directive_memory_map(QIgvm *ctx, const uint8_t *header_data,
}
/* Find the parameter area that should hold the memory map */
- param_entry = qigvm_find_param_entry(ctx,
- param->parameter_area_index, errp);
- if (param_entry == NULL) {
+ if (!qigvm_find_param_validate(ctx, param->parameter_area_index, param,
+ &data, &size, errp)) {
return -1;
}
- max_entry_count = param_entry->size / sizeof(IGVM_VHS_MEMORY_MAP_ENTRY);
- mm_entry = (IGVM_VHS_MEMORY_MAP_ENTRY *)param_entry->data;
+ max_entry_count = size / sizeof(IGVM_VHS_MEMORY_MAP_ENTRY);
+ mm_entry = (IGVM_VHS_MEMORY_MAP_ENTRY *)data;
retval = get_mem_map_entry(entry, &cgmm_entry, errp);
while (retval == 0) {
@@ -860,12 +860,12 @@ static int qigvm_directive_device_tree(QIgvm *ctx, const uint8_t *header_data,
{
const IGVM_VHS_PARAMETER *param = (const IGVM_VHS_PARAMETER *)header_data;
g_autofree void *fdt_packed = NULL;
- QIgvmParameterData *param_entry;
+ uint8_t *data;
+ uint32_t size;
uint32_t fdt_size;
- param_entry = qigvm_find_param_entry(ctx,
- param->parameter_area_index, errp);
- if (param_entry == NULL) {
+ if (!qigvm_find_param_validate(ctx, param->parameter_area_index, param,
+ &data, &size, errp)) {
return -1;
}
@@ -883,14 +883,14 @@ static int qigvm_directive_device_tree(QIgvm *ctx, const uint8_t *header_data,
}
fdt_size = fdt_totalsize(fdt_packed);
- if (fdt_size > param_entry->size) {
+ if (fdt_size > size) {
error_setg(errp,
"IGVM: device tree size exceeds parameter area"
" defined in IGVM file");
return -1;
}
- memcpy(param_entry->data, fdt_packed, fdt_size);
+ memcpy(data, fdt_packed, fdt_size);
return 0;
}
diff --git a/target/i386/igvm.c b/target/i386/igvm.c
index ad9bf87761..db365cb80e 100644
--- a/target/i386/igvm.c
+++ b/target/i386/igvm.c
@@ -187,20 +187,20 @@ void qigvm_x86_bsp_reset(CPUX86State *env)
int qigvm_directive_madt(QIgvm *ctx, const uint8_t *header_data, Error **errp)
{
const IGVM_VHS_PARAMETER *param = (const IGVM_VHS_PARAMETER *)header_data;
- QIgvmParameterData *param_entry;
+ uint8_t *data;
+ uint32_t size;
int result = 0;
/* Find the parameter area that should hold the MADT data */
- param_entry = qigvm_find_param_entry(ctx,
- param->parameter_area_index, errp);
- if (param_entry == NULL) {
+ if (!qigvm_find_param_validate(ctx, param->parameter_area_index, param,
+ &data, &size, errp)) {
return -1;
}
GArray *madt = acpi_build_madt_standalone(ctx->machine_state);
- if (madt->len <= param_entry->size) {
- memcpy(param_entry->data, madt->data, madt->len);
+ if (madt->len <= size) {
+ memcpy(data, madt->data, madt->len);
} else {
error_setg(
errp,
--
2.55.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] igvm: validate byte_offset before using it in parameter directives
2026-09-04 11:42 ` [PATCH v2 1/2] igvm: validate byte_offset before using it " Luigi Leonardi
@ 2026-09-04 12:55 ` Stefano Garzarella
0 siblings, 0 replies; 5+ messages in thread
From: Stefano Garzarella @ 2026-09-04 12:55 UTC (permalink / raw)
To: Luigi Leonardi; +Cc: qemu-devel, Gerd Hoffmann, Ani Sinha
On Fri, Sep 04, 2026 at 01:42:55PM +0200, Luigi Leonardi wrote:
>None of the directive handlers that place data at a byte_offset within
>a parameter area validated that byte_offset actually falls within the
>parameter area's size. A malformed IGVM file with byte_offset > size would
>underflow the "size - byte_offset" computation used to determine
>remaining space, wrapping to a huge value and defeating the size
>check, then write out of bounds through param_entry->data +
>byte_offset.
>
>Add qigvm_find_param_validate(), which looks up the parameter area,
>checks byte_offset against its size, and returns the offset-adjusted
>data pointer and remaining size via output parameters instead of the
>raw QIgvmParameterData entry. This keeps the byte_offset arithmetic in
>one place instead of repeating param_entry->data + byte_offset and
>param_entry->size - byte_offset at every call site.
>
>Use it in the vp-count and environment-info handlers, adding an
>explicit check that the fixed-size write fits in the remaining space.
>
>Signed-off-by: Luigi Leonardi <leonardi@redhat.com>
>---
> backends/igvm.c | 68 +++++++++++++++++++++++++++++++++++-------
> include/system/igvm-internal.h | 6 ++++
> 2 files changed, 63 insertions(+), 11 deletions(-)
>
>diff --git a/backends/igvm.c b/backends/igvm.c
>index 7b7bdc72b7..8c07f2ce5e 100644
>--- a/backends/igvm.c
>+++ b/backends/igvm.c
>@@ -101,6 +101,39 @@ qigvm_find_param_entry(QIgvm *igvm, uint32_t parameter_area_index,
> return NULL;
> }
>
>+/*
>+ * Look up a parameter area and check that param->byte_offset falls within
>+ * it, in one step. On success, *data and *size are set to the
>+ * offset-adjusted write location and remaining space within the parameter
>+ * area, so callers never need to touch param->byte_offset themselves.
>+ */
>+bool
>+qigvm_find_param_validate(QIgvm *igvm, uint32_t parameter_area_index,
I'm not sure about the name, but I don't have anything better to
suggest, maybe qigvm_get_param_data() ?
>+ const IGVM_VHS_PARAMETER *param,
>+ uint8_t **data, uint32_t *size,
>+ Error **errp)
>+{
>+ QIgvmParameterData *param_entry;
>+
>+ assert(data && size);
>+
>+ param_entry = qigvm_find_param_entry(igvm, parameter_area_index, errp);
>+ if (!param_entry) {
>+ return false;
>+ }
All others qigvm_* functions returns 0 on success and != 0 on failure,
should we be consistent ?
Or maybe we can return the data pointer (with NULL as error).
>+
>+ if (param->byte_offset > param_entry->size) {
>+ error_setg(errp,
>+ "IGVM: byte_offset 0x%x exceeds parameter area size 0x%x",
>+ param->byte_offset, param_entry->size);
>+ return false;
>+ }
>+
>+ *data = param_entry->data + param->byte_offset;
>+ *size = param_entry->size - param->byte_offset;
>+ return true;
>+}
>+
> static int qigvm_directive_page_data(QIgvm *ctx, const uint8_t *header_data,
> Error **errp);
> static int qigvm_directive_vp_context(QIgvm *ctx, const uint8_t *header_data,
>@@ -682,17 +715,24 @@ static int qigvm_directive_vp_count(QIgvm *ctx, const uint8_t *header_data,
> Error **errp)
> {
> const IGVM_VHS_PARAMETER *param = (const IGVM_VHS_PARAMETER *)header_data;
>- QIgvmParameterData *param_entry;
>+ uint8_t *data;
>+ uint32_t size;
nit: following the previous param_entry, maybe we can call them
param_data and param_size all over the place.
> uint32_t *vp_count;
> CPUState *cpu;
>
>- param_entry = qigvm_find_param_entry(ctx,
>- param->parameter_area_index, errp);
>- if (param_entry == NULL) {
>+ if (!qigvm_find_param_validate(ctx, param->parameter_area_index, param,
>+ &data, &size, errp)) {
>+ return -1;
>+ }
>+
>+ if (sizeof(*vp_count) > size) {
>+ error_setg(errp,
>+ "IGVM: vp-count parameter exceeds parameter area "
>+ "defined in IGVM file");
> return -1;
> }
>
>- vp_count = (uint32_t *)(param_entry->data + param->byte_offset);
>+ vp_count = (uint32_t *)data;
> *vp_count = 0;
> CPU_FOREACH(cpu)
> {
>@@ -707,17 +747,23 @@ static int qigvm_directive_environment_info(QIgvm *ctx,
> Error **errp)
> {
> const IGVM_VHS_PARAMETER *param = (const IGVM_VHS_PARAMETER *)header_data;
>- QIgvmParameterData *param_entry;
>+ uint8_t *data;
>+ uint32_t size;
> IgvmEnvironmentInfo *environmental_state;
>
>- param_entry = qigvm_find_param_entry(ctx,
>- param->parameter_area_index, errp);
>- if (param_entry == NULL) {
>+ if (!qigvm_find_param_validate(ctx, param->parameter_area_index, param,
>+ &data, &size, errp)) {
>+ return -1;
>+ }
>+
>+ if (sizeof(*environmental_state) > size) {
>+ error_setg(errp,
>+ "IGVM: environment-info parameter exceeds parameter area "
>+ "defined in IGVM file");
> return -1;
> }
>
>- environmental_state =
>- (IgvmEnvironmentInfo *)(param_entry->data + param->byte_offset);
>+ environmental_state = (IgvmEnvironmentInfo *)data;
> environmental_state->memory_is_shared = 1;
>
> return 0;
>diff --git a/include/system/igvm-internal.h b/include/system/igvm-internal.h
>index 9e9fa1d9af..6526b5055c 100644
>--- a/include/system/igvm-internal.h
>+++ b/include/system/igvm-internal.h
>@@ -81,4 +81,10 @@ QIgvmParameterData*
> qigvm_find_param_entry(QIgvm *igvm, uint32_t parameter_area_index,
> Error **errp);
>
>+bool
>+qigvm_find_param_validate(QIgvm *igvm, uint32_t parameter_area_index,
>+ const IGVM_VHS_PARAMETER *param,
>+ uint8_t **data, uint32_t *size,
>+ Error **errp);
>+
> #endif
>
>--
>2.55.0
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] igvm: honor byte_offset when writing memory map, MADT and device tree
2026-09-04 11:42 ` [PATCH v2 2/2] igvm: honor byte_offset when writing memory map, MADT and device tree Luigi Leonardi
@ 2026-09-04 13:02 ` Stefano Garzarella
0 siblings, 0 replies; 5+ messages in thread
From: Stefano Garzarella @ 2026-09-04 13:02 UTC (permalink / raw)
To: Luigi Leonardi; +Cc: qemu-devel, Gerd Hoffmann, Ani Sinha
On Fri, Sep 04, 2026 at 01:42:56PM +0200, Luigi Leonardi wrote:
>qigvm_directive_memory_map(), qigvm_directive_madt() and
>qigvm_directive_device_tree() all wrote their data unconditionally at
>the start of the parameter area's buffer, ignoring param->byte_offset
>from the IGVM_VHS_PARAMETER header. This is harmless when a
>directive's offset happens to be 0, but breaks for IGVM files that pack
>multiple parameters into a single shared parameter area at different
>offsets: a later directive would overwrite the data written by an earlier
>one at the start of the buffer, corrupting it.
>
>Switch these handlers to qigvm_find_param_validate(), introduced in
>the previous patch, and use the offset-adjusted data pointer and
>remaining size it returns instead of writing at param_entry->data and
>sizing checks against param_entry->size directly. This both honors
>byte_offset and validates it against the parameter area size before
>it is used.
Do we need a Fixes tag?
The rest LGTM,
Stefano
>
>Signed-off-by: Luigi Leonardi <leonardi@redhat.com>
>---
> backends/igvm.c | 24 ++++++++++++------------
> target/i386/igvm.c | 12 ++++++------
> 2 files changed, 18 insertions(+), 18 deletions(-)
>
>diff --git a/backends/igvm.c b/backends/igvm.c
>index 8c07f2ce5e..4d622eac6a 100644
>--- a/backends/igvm.c
>+++ b/backends/igvm.c
>@@ -638,7 +638,8 @@ static int qigvm_directive_memory_map(QIgvm *ctx, const uint8_t *header_data,
> const IGVM_VHS_PARAMETER *param = (const IGVM_VHS_PARAMETER *)header_data;
> int (*get_mem_map_entry)(int index, ConfidentialGuestMemoryMapEntry *entry,
> Error **errp) = NULL;
>- QIgvmParameterData *param_entry;
>+ uint8_t *data;
>+ uint32_t size;
> int max_entry_count;
> int entry = 0;
> IGVM_VHS_MEMORY_MAP_ENTRY *mm_entry;
>@@ -659,14 +660,13 @@ static int qigvm_directive_memory_map(QIgvm *ctx, const uint8_t *header_data,
> }
>
> /* Find the parameter area that should hold the memory map */
>- param_entry = qigvm_find_param_entry(ctx,
>- param->parameter_area_index, errp);
>- if (param_entry == NULL) {
>+ if (!qigvm_find_param_validate(ctx, param->parameter_area_index, param,
>+ &data, &size, errp)) {
> return -1;
> }
>
>- max_entry_count = param_entry->size / sizeof(IGVM_VHS_MEMORY_MAP_ENTRY);
>- mm_entry = (IGVM_VHS_MEMORY_MAP_ENTRY *)param_entry->data;
>+ max_entry_count = size / sizeof(IGVM_VHS_MEMORY_MAP_ENTRY);
>+ mm_entry = (IGVM_VHS_MEMORY_MAP_ENTRY *)data;
>
> retval = get_mem_map_entry(entry, &cgmm_entry, errp);
> while (retval == 0) {
>@@ -860,12 +860,12 @@ static int qigvm_directive_device_tree(QIgvm *ctx, const uint8_t *header_data,
> {
> const IGVM_VHS_PARAMETER *param = (const IGVM_VHS_PARAMETER *)header_data;
> g_autofree void *fdt_packed = NULL;
>- QIgvmParameterData *param_entry;
>+ uint8_t *data;
>+ uint32_t size;
> uint32_t fdt_size;
>
>- param_entry = qigvm_find_param_entry(ctx,
>- param->parameter_area_index, errp);
>- if (param_entry == NULL) {
>+ if (!qigvm_find_param_validate(ctx, param->parameter_area_index, param,
>+ &data, &size, errp)) {
> return -1;
> }
>
>@@ -883,14 +883,14 @@ static int qigvm_directive_device_tree(QIgvm *ctx, const uint8_t *header_data,
> }
>
> fdt_size = fdt_totalsize(fdt_packed);
>- if (fdt_size > param_entry->size) {
>+ if (fdt_size > size) {
> error_setg(errp,
> "IGVM: device tree size exceeds parameter area"
> " defined in IGVM file");
> return -1;
> }
>
>- memcpy(param_entry->data, fdt_packed, fdt_size);
>+ memcpy(data, fdt_packed, fdt_size);
>
> return 0;
> }
>diff --git a/target/i386/igvm.c b/target/i386/igvm.c
>index ad9bf87761..db365cb80e 100644
>--- a/target/i386/igvm.c
>+++ b/target/i386/igvm.c
>@@ -187,20 +187,20 @@ void qigvm_x86_bsp_reset(CPUX86State *env)
> int qigvm_directive_madt(QIgvm *ctx, const uint8_t *header_data, Error **errp)
> {
> const IGVM_VHS_PARAMETER *param = (const IGVM_VHS_PARAMETER *)header_data;
>- QIgvmParameterData *param_entry;
>+ uint8_t *data;
>+ uint32_t size;
> int result = 0;
>
> /* Find the parameter area that should hold the MADT data */
>- param_entry = qigvm_find_param_entry(ctx,
>- param->parameter_area_index, errp);
>- if (param_entry == NULL) {
>+ if (!qigvm_find_param_validate(ctx, param->parameter_area_index, param,
>+ &data, &size, errp)) {
> return -1;
> }
>
> GArray *madt = acpi_build_madt_standalone(ctx->machine_state);
>
>- if (madt->len <= param_entry->size) {
>- memcpy(param_entry->data, madt->data, madt->len);
>+ if (madt->len <= size) {
>+ memcpy(data, madt->data, madt->len);
> } else {
> error_setg(
> errp,
>
>--
>2.55.0
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-09-04 13:04 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-04 11:42 [PATCH v2 0/2] igvm: fix byte_offset handling in parameter directives Luigi Leonardi
2026-09-04 11:42 ` [PATCH v2 1/2] igvm: validate byte_offset before using it " Luigi Leonardi
2026-09-04 12:55 ` Stefano Garzarella
2026-09-04 11:42 ` [PATCH v2 2/2] igvm: honor byte_offset when writing memory map, MADT and device tree Luigi Leonardi
2026-09-04 13:02 ` Stefano Garzarella
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.