From: Gerd Hoffmann <[email protected]>
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]>
(cherry picked from commit f252769a23e67765f9b95d8944ca3da6c9edf58b)
Signed-off-by: Michael Tokarev <[email protected]>
diff --git a/hw/uefi/var-service-vars.c b/hw/uefi/var-service-vars.c
index 27421c6e2d..82ff4e429a 100644
--- a/hw/uefi/var-service-vars.c
+++ b/hw/uefi/var-service-vars.c
@@ -260,6 +260,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)
{
@@ -307,7 +318,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);
}
@@ -377,7 +388,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);
}
@@ -567,7 +578,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);
}
@@ -588,7 +599,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.47.3