Hi Gerd,

On 2/7/26 11:23, Gerd Hoffmann wrote:
This was never meant to be active in production builds.  It's a code
path not hit on a normal boot (OVMF wouldn't try variable updates which
are not allowed), so this went unnoticed.

Wrap the call into "if (VARIABLE_POLICY_DEBUG)" so it is never used
unless the #define is changed to true.

Also fix the name printing to not overrun the entry size.

Fixes: CVE-2026-58582
Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3615
Signed-off-by: Gerd Hoffmann <[email protected]>
---
  hw/uefi/var-service-policy.c | 9 +++++++--
  1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/hw/uefi/var-service-policy.c b/hw/uefi/var-service-policy.c
index 989bf87ddb86..b56fc62f7092 100644
--- a/hw/uefi/var-service-policy.c
+++ b/hw/uefi/var-service-policy.c
@@ -16,6 +16,8 @@
#include "trace.h" +#define VARIABLE_POLICY_DEBUG 0

To avoid this anti-pattern, ...

  static void calc_policy(uefi_var_policy *pol);
static int uefi_var_policy_post_load(void *opaque, int version_id)
@@ -40,11 +42,12 @@ const VMStateDescription vmstate_uefi_var_policy = {
  static void print_policy_entry(variable_policy_entry *pe)
  {
      uint16_t *name = (void *)pe + pe->offset_to_name;
+    uint16_t *end = (void *)pe + pe->size;
fprintf(stderr, "%s:\n", __func__); fprintf(stderr, " name ´");
-    while (*name) {
+    while (*name && name < end) {
          fprintf(stderr, "%c", *name);
          name++;
      }
@@ -173,7 +176,9 @@ efi_status uefi_vars_policy_check(uefi_vars_state *uv,
      pe = pol->entry;
uefi_trace_variable(__func__, var->guid, var->name, var->name_size);

... better keep it compiled with a trace event:

       if (trace_event_get_state_backends(TRACE_UEFI_POLICY)) {

-    print_policy_entry(pe);
+    if (VARIABLE_POLICY_DEBUG) {
+        print_policy_entry(pe);
+    }
if ((var->attributes & pe->attributes_must_have) != pe->attributes_must_have) {
          trace_uefi_vars_policy_deny("must-have-attr");


Reply via email to