Subject: xen/evtchn: fix race between FIFO expand and reset operations
From: Roger Pau Monne <[email-masked]>

evtchn_fifo_expand_array() will check for the domain evtchn_fifo being
populated without holding the event_lock, which can lead to a race with a
concurrent evtchn_reset().

Ensure the checking for evtchn_fifo presence is done while holding the
event_lock.

This is XSA-505 / CVE-2026-62432.

Fixes: 400b3bd6426f ("evtchn: make EVTCHNOP_reset suitable for kexec")
Signed-off-by: Roger Pau Monné <[email-masked]>
Reviewed-by: Jan Beulich <[email-masked]>
Reviewed-by: Andrew Cooper <[email-masked]>

diff --git a/xen/common/event_fifo.c b/xen/common/event_fifo.c
index 37cba9bc4564..cae08a594e9f 100644
--- a/xen/common/event_fifo.c
+++ b/xen/common/event_fifo.c
@@ -692,13 +692,11 @@ static int add_page_to_event_array(struct domain *d, unsigned long gfn)
 int evtchn_fifo_expand_array(const struct evtchn_expand_array *expand_array)
 {
     struct domain *d = current->domain;
-    int rc;
-
-    if ( !d->evtchn_fifo )
-        return -EOPNOTSUPP;
+    int rc = -EOPNOTSUPP;
 
     write_lock(&d->event_lock);
-    rc = add_page_to_event_array(d, expand_array->array_gfn);
+    if ( d->evtchn_fifo )
+        rc = add_page_to_event_array(d, expand_array->array_gfn);
     write_unlock(&d->event_lock);
 
     return rc;