- nbd/server: CVE-2024-7409: Close stray clients at server-stop - main-loop.h: introduce qemu_in_main_thread() - aio-wait.h: introduce AIO_WAIT_WHILE_UNLOCKED - nbd/server: CVE-2024-7409: Drop non-negotiating clients - nbd/server: CVE-2024-7409: Cap default max-connections to 100 - nbd/server: Plumb in new args to nbd_client_add() - nbd: Minor style and typo fixes Signed-off-by: Jiabo Feng <fengjiabo1@huawei.com> (cherry picked from commit 5e30f8e310a15452f86723a0ae459d303cc29470)
119 lines
4.1 KiB
Diff
119 lines
4.1 KiB
Diff
From f4b69408785a19f4acd0b16cd3b97aa93da48d47 Mon Sep 17 00:00:00 2001
|
|
From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
|
Date: Thu, 3 Mar 2022 10:15:46 -0500
|
|
Subject: [PATCH 6/7] main-loop.h: introduce qemu_in_main_thread()
|
|
|
|
When invoked from the main loop, this function is the same
|
|
as qemu_mutex_iothread_locked, and returns true if the BQL is held.
|
|
When invoked from iothreads or tests, it returns true only
|
|
if the current AioContext is the Main Loop.
|
|
|
|
This essentially just extends qemu_mutex_iothread_locked to work
|
|
also in unit tests or other users like storage-daemon, that run
|
|
in the Main Loop but end up using the implementation in
|
|
stubs/iothread-lock.c.
|
|
|
|
Using qemu_mutex_iothread_locked in unit tests defaults to false
|
|
because they use the implementation in stubs/iothread-lock,
|
|
making all assertions added in next patches fail despite the
|
|
AioContext is still the main loop.
|
|
|
|
See the comment in the function header for more information.
|
|
|
|
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
|
|
Message-Id: <20220303151616.325444-2-eesposit@redhat.com>
|
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
---
|
|
include/qemu/main-loop.h | 24 ++++++++++++++++++++++++
|
|
softmmu/cpus.c | 5 +++++
|
|
stubs/iothread-lock-block.c | 8 ++++++++
|
|
stubs/meson.build | 3 +++
|
|
4 files changed, 40 insertions(+)
|
|
create mode 100644 stubs/iothread-lock-block.c
|
|
|
|
diff --git a/include/qemu/main-loop.h b/include/qemu/main-loop.h
|
|
index 85dd5ada9e..a472ebd289 100644
|
|
--- a/include/qemu/main-loop.h
|
|
+++ b/include/qemu/main-loop.h
|
|
@@ -242,9 +242,33 @@ AioContext *iohandler_get_aio_context(void);
|
|
* must always be taken outside other locks. This function helps
|
|
* functions take different paths depending on whether the current
|
|
* thread is running within the main loop mutex.
|
|
+ *
|
|
+ * This function should never be used in the block layer, because
|
|
+ * unit tests, block layer tools and qemu-storage-daemon do not
|
|
+ * have a BQL.
|
|
+ * Please instead refer to qemu_in_main_thread().
|
|
*/
|
|
bool qemu_mutex_iothread_locked(void);
|
|
|
|
+/**
|
|
+ * qemu_in_main_thread: return whether it's possible to safely access
|
|
+ * the global state of the block layer.
|
|
+ *
|
|
+ * Global state of the block layer is not accessible from I/O threads
|
|
+ * or worker threads; only from threads that "own" the default
|
|
+ * AioContext that qemu_get_aio_context() returns. For tests, block
|
|
+ * layer tools and qemu-storage-daemon there is a designated thread that
|
|
+ * runs the event loop for qemu_get_aio_context(), and that is the
|
|
+ * main thread.
|
|
+ *
|
|
+ * For emulators, however, any thread that holds the BQL can act
|
|
+ * as the block layer main thread; this will be any of the actual
|
|
+ * main thread, the vCPU threads or the RCU thread.
|
|
+ *
|
|
+ * For clarity, do not use this function outside the block layer.
|
|
+ */
|
|
+bool qemu_in_main_thread(void);
|
|
+
|
|
/**
|
|
* qemu_mutex_lock_iothread: Lock the main loop mutex.
|
|
*
|
|
diff --git a/softmmu/cpus.c b/softmmu/cpus.c
|
|
index 071085f840..3f61a3c31d 100644
|
|
--- a/softmmu/cpus.c
|
|
+++ b/softmmu/cpus.c
|
|
@@ -481,6 +481,11 @@ bool qemu_mutex_iothread_locked(void)
|
|
return iothread_locked;
|
|
}
|
|
|
|
+bool qemu_in_main_thread(void)
|
|
+{
|
|
+ return qemu_mutex_iothread_locked();
|
|
+}
|
|
+
|
|
/*
|
|
* The BQL is taken from so many places that it is worth profiling the
|
|
* callers directly, instead of funneling them all through a single function.
|
|
diff --git a/stubs/iothread-lock-block.c b/stubs/iothread-lock-block.c
|
|
new file mode 100644
|
|
index 0000000000..c88ed70462
|
|
--- /dev/null
|
|
+++ b/stubs/iothread-lock-block.c
|
|
@@ -0,0 +1,8 @@
|
|
+#include "qemu/osdep.h"
|
|
+#include "qemu/main-loop.h"
|
|
+
|
|
+bool qemu_in_main_thread(void)
|
|
+{
|
|
+ return qemu_get_current_aio_context() == qemu_get_aio_context();
|
|
+}
|
|
+
|
|
diff --git a/stubs/meson.build b/stubs/meson.build
|
|
index 71469c1d50..3aca1d67c1 100644
|
|
--- a/stubs/meson.build
|
|
+++ b/stubs/meson.build
|
|
@@ -18,6 +18,9 @@ if linux_io_uring.found()
|
|
stub_ss.add(files('io_uring.c'))
|
|
endif
|
|
stub_ss.add(files('iothread-lock.c'))
|
|
+if have_block
|
|
+ stub_ss.add(files('iothread-lock-block.c'))
|
|
+endif
|
|
stub_ss.add(files('isa-bus.c'))
|
|
stub_ss.add(files('is-daemonized.c'))
|
|
if libaio.found()
|
|
--
|
|
2.45.1.windows.1
|
|
|