The buffer size checks do not consider the mm_header size, simliar to
CVE-2026-5744. Factor out the repeated size check to a small helper
function, fix the check, update all places to use the new helper.
Fixes: CVE-2026-41435
Fixes: db1ecfb473ac ("hw/uefi: add var-service-vars.c")
Reported-by: Katherine Leaver <[email protected]>
Signed-off-by: Gerd Hoffmann <[email protected]>
Message-ID: <[email protected]>
---
hw/uefi/var-service-vars.c | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/hw/uefi/var-service-vars.c b/hw/uefi/var-service-vars.c
index 5e3907118d4b..24e6516a9cc0 100644
--- a/hw/uefi/var-service-vars.c
+++ b/hw/uefi/var-service-vars.c
@@ -297,6 +297,17 @@ static size_t uefi_vars_mm_error(mm_header *mhdr,
mm_variable *mvar,
return sizeof(*mvar);
}
+static bool check_buffer_size(uefi_vars_state *uv, uint64_t length)
+{
+ /* uefi_vars_cmd_mm() checks that */
+ g_assert(uv->buf_size >= sizeof(mm_header));
+
+ if (uv->buf_size - sizeof(mm_header) < length) {
+ return false;
+ }
+ return true;
+}
+
static size_t uefi_vars_mm_get_variable(uefi_vars_state *uv, mm_header *mhdr,
mm_variable *mvar, void *func)
{
@@ -344,7 +355,7 @@ static size_t uefi_vars_mm_get_variable(uefi_vars_state
*uv, mm_header *mhdr,
if (uadd64_overflow(length, va->data_size, &length)) {
return uefi_vars_mm_error(mhdr, mvar, EFI_BAD_BUFFER_SIZE);
}
- if (uv->buf_size < length) {
+ if (!check_buffer_size(uv, length)) {
return uefi_vars_mm_error(mhdr, mvar, EFI_BAD_BUFFER_SIZE);
}
@@ -414,7 +425,7 @@ uefi_vars_mm_get_next_variable(uefi_vars_state *uv,
mm_header *mhdr,
}
length = sizeof(*mvar) + sizeof(*nv) + var->name_size;
- if (uv->buf_size < length) {
+ if (!check_buffer_size(uv, length)) {
return uefi_vars_mm_error(mhdr, mvar, EFI_BAD_BUFFER_SIZE);
}
@@ -605,7 +616,7 @@ static size_t uefi_vars_mm_variable_info(uefi_vars_state
*uv, mm_header *mhdr,
uint64_t length;
length = sizeof(*mvar) + sizeof(*vi);
- if (uv->buf_size < length) {
+ if (!check_buffer_size(uv, length)) {
return uefi_vars_mm_error(mhdr, mvar, EFI_BAD_BUFFER_SIZE);
}
@@ -626,7 +637,7 @@ uefi_vars_mm_get_payload_size(uefi_vars_state *uv,
mm_header *mhdr,
uint64_t length;
length = sizeof(*mvar) + sizeof(*ps);
- if (uv->buf_size < length) {
+ if (!check_buffer_size(uv, length)) {
return uefi_vars_mm_error(mhdr, mvar, EFI_BAD_BUFFER_SIZE);
}
--
2.54.0