Use initialized in event_notifier_get_fd() and event_notifier_get_wfd()
instead of exposing the descriptor fields of an uninitialized notifier.
This makes a zeroed notifier report the same absent descriptor as one
that has been cleaned up, while preserving fd 0 for initialized notifiers.

Document the accessor contract so callers can test for an absent notifier
without accessing its initialized flag directly.

Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]>
---
 include/qemu/event_notifier.h | 1 +
 util/event_notifier-posix.c   | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/include/qemu/event_notifier.h b/include/qemu/event_notifier.h
index 8a4ff308e19..de2e876cb15 100644
--- a/include/qemu/event_notifier.h
+++ b/include/qemu/event_notifier.h
@@ -37,6 +37,7 @@ int event_notifier_test_and_clear(EventNotifier *);
 
 #ifdef CONFIG_POSIX
 void event_notifier_init_fd(EventNotifier *, int fd);
+/* These accessors return -1 for an uninitialized notifier. */
 int event_notifier_get_fd(const EventNotifier *);
 int event_notifier_get_wfd(const EventNotifier *);
 #else
diff --git a/util/event_notifier-posix.c b/util/event_notifier-posix.c
index 83fdbb96bbc..34a2716dbf2 100644
--- a/util/event_notifier-posix.c
+++ b/util/event_notifier-posix.c
@@ -96,12 +96,12 @@ void event_notifier_cleanup(EventNotifier *e)
 
 int event_notifier_get_fd(const EventNotifier *e)
 {
-    return e->rfd;
+    return e->initialized ? e->rfd : -1;
 }
 
 int event_notifier_get_wfd(const EventNotifier *e)
 {
-    return e->wfd;
+    return e->initialized ? e->wfd : -1;
 }
 
 int event_notifier_set(EventNotifier *e)
-- 
2.43.0


Reply via email to