All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/7] Fixes for 11.1
@ 2026-07-25 14:00 Marc-André Lureau
  2026-07-25 14:00 ` [PATCH 1/7] hw/display/virtio-gpu-rutabaga: zero-init capset info response Marc-André Lureau
                   ` (6 more replies)
  0 siblings, 7 replies; 19+ messages in thread
From: Marc-André Lureau @ 2026-07-25 14:00 UTC (permalink / raw)
  To: qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Akihiko Odaki,
	Dmitry Osipenko, Stefan Hajnoczi, Kevin Wolf, Hanna Reitz,
	qemu-block, Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas, Marc-André Lureau, Haotian Jiang

Hi

Here are some assorted patches worth considering for the 11.1 freeze
bug-fix period.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
Marc-André Lureau (7):
      hw/display/virtio-gpu-rutabaga: zero-init capset info response
      block/blkio: fix error return value on getlength()
      Fix many -Werror=maybe-uninitialized
      hw/hexagon: fix machine->fdt leak in qom-test
      hw/core/machine: free machine->fdt in machine_finalize()
      migration/multifd: fix Error leak in multifd_recv_terminate_threads()
      qdev-monitor: drain RCU callbacks in qdev_device_add_from_qdict

 block/blkio.c                    |  8 ++++----
 block/qcow2.c                    |  2 +-
 hw/core/machine.c                |  1 +
 hw/cxl/cxl-host.c                |  2 +-
 hw/display/virtio-gpu-rutabaga.c |  2 ++
 hw/hexagon/virt.c                |  9 +--------
 hw/scsi/scsi-disk.c              |  2 +-
 hw/scsi/scsi-generic.c           |  4 ++--
 hw/scsi/virtio-scsi.c            |  2 +-
 io/net-listener.c                | 10 +++++-----
 migration/multifd.c              |  1 +
 system/qdev-monitor.c            | 33 ++++++++++-----------------------
 target/i386/cpu.c                |  3 ++-
 target/i386/emulate/x86_mmu.c    |  4 ++--
 14 files changed, 34 insertions(+), 49 deletions(-)
---
base-commit: 300438ffbb8d9430cac2fcc15cba6f482b2c0587
change-id: 20260725-fix2-6e51d231794b

Best regards,
--  
Marc-André Lureau <marcandre.lureau@redhat.com>


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 1/7] hw/display/virtio-gpu-rutabaga: zero-init capset info response
  2026-07-25 14:00 [PATCH 0/7] Fixes for 11.1 Marc-André Lureau
@ 2026-07-25 14:00 ` Marc-André Lureau
  2026-07-26  7:32   ` Akihiko Odaki
  2026-07-25 14:00 ` [PATCH 2/7] block/blkio: fix error return value on getlength() Marc-André Lureau
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 19+ messages in thread
From: Marc-André Lureau @ 2026-07-25 14:00 UTC (permalink / raw)
  To: qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Akihiko Odaki,
	Dmitry Osipenko, Stefan Hajnoczi, Kevin Wolf, Hanna Reitz,
	qemu-block, Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas, Marc-André Lureau, Haotian Jiang

rutabaga_cmd_get_capset_info() only fills in capset_id,
capset_max_version and capset_max_size before sending the response to
the guest. The remaining fields of struct virtio_gpu_resp_capset_info,
including hdr.fence_id, hdr.ctx_id and hdr.ring_idx, are left with
stack garbage and leaked to the guest, including host pointers useful
for an ASLR bypass.

Zero the response first, matching virgl_cmd_get_capset_info().

Not a real risk thanks to -ftrivial-auto-var-init=zero.

Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3609
Fixes: 1dcc6adbc168 ("gfxstream + rutabaga: add initial support for gfxstream")
Reported-by: Haotian Jiang <jianghaotian.sunday@gmail.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/display/virtio-gpu-rutabaga.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/hw/display/virtio-gpu-rutabaga.c b/hw/display/virtio-gpu-rutabaga.c
index 4d7d7b245929..95a19eed7eda 100644
--- a/hw/display/virtio-gpu-rutabaga.c
+++ b/hw/display/virtio-gpu-rutabaga.c
@@ -555,6 +555,8 @@ rutabaga_cmd_get_capset_info(VirtIOGPU *g, struct virtio_gpu_ctrl_command *cmd)
 
     VIRTIO_GPU_FILL_CMD(info);
 
+    memset(&resp, 0, sizeof(resp));
+
     result = rutabaga_get_capset_info(vr->rutabaga, info.capset_index,
                                       &resp.capset_id, &resp.capset_max_version,
                                       &resp.capset_max_size);

-- 
2.55.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 2/7] block/blkio: fix error return value on getlength()
  2026-07-25 14:00 [PATCH 0/7] Fixes for 11.1 Marc-André Lureau
  2026-07-25 14:00 ` [PATCH 1/7] hw/display/virtio-gpu-rutabaga: zero-init capset info response Marc-André Lureau
@ 2026-07-25 14:00 ` Marc-André Lureau
  2026-07-26  7:36   ` Akihiko Odaki
  2026-07-25 14:00 ` [PATCH 3/7] Fix many -Werror=maybe-uninitialized Marc-André Lureau
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 19+ messages in thread
From: Marc-André Lureau @ 2026-07-25 14:00 UTC (permalink / raw)
  To: qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Akihiko Odaki,
	Dmitry Osipenko, Stefan Hajnoczi, Kevin Wolf, Hanna Reitz,
	qemu-block, Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas, Marc-André Lureau

Negative values should be return for errors.

It also helps with GCC false-positives:
../block/blkio.c: In function ‘blkio_co_getlength’:
../block/blkio.c:943:8: error: ‘ret’ may be used uninitialized [-Werror=maybe-uninitialized]
  943 |     if (ret < 0) {
      |        ^

Fixes: fd66dbd424 ("blkio: add libblkio block driver")
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 block/blkio.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/block/blkio.c b/block/blkio.c
index fb8bec27d71a..d2ba2a4d58dc 100644
--- a/block/blkio.c
+++ b/block/blkio.c
@@ -935,13 +935,13 @@ static int64_t coroutine_fn blkio_co_getlength(BlockDriverState *bs)
 {
     BDRVBlkioState *s = bs->opaque;
     uint64_t capacity;
-    int ret;
+    int ret = -1;
 
     WITH_QEMU_LOCK_GUARD(&s->blkio_lock) {
         ret = blkio_get_uint64(s->blkio, "capacity", &capacity);
     }
     if (ret < 0) {
-        return -ret;
+        return ret;
     }
 
     return capacity;

-- 
2.55.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 3/7] Fix many -Werror=maybe-uninitialized
  2026-07-25 14:00 [PATCH 0/7] Fixes for 11.1 Marc-André Lureau
  2026-07-25 14:00 ` [PATCH 1/7] hw/display/virtio-gpu-rutabaga: zero-init capset info response Marc-André Lureau
  2026-07-25 14:00 ` [PATCH 2/7] block/blkio: fix error return value on getlength() Marc-André Lureau
@ 2026-07-25 14:00 ` Marc-André Lureau
  2026-07-26  8:29   ` Akihiko Odaki
  2026-07-25 14:00 ` [PATCH 4/7] hw/hexagon: fix machine->fdt leak in qom-test Marc-André Lureau
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 19+ messages in thread
From: Marc-André Lureau @ 2026-07-25 14:00 UTC (permalink / raw)
  To: qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Akihiko Odaki,
	Dmitry Osipenko, Stefan Hajnoczi, Kevin Wolf, Hanna Reitz,
	qemu-block, Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas, Marc-André Lureau

When compiled with -Og, gcc produces many false-positives
gcc (GCC) 16.1.1 20260515 (Red Hat 16.1.1-2).

We already use auto-var-init=zero, but better be explicit.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 block/blkio.c                 |  4 ++--
 block/qcow2.c                 |  2 +-
 hw/cxl/cxl-host.c             |  2 +-
 hw/scsi/scsi-disk.c           |  2 +-
 hw/scsi/scsi-generic.c        |  4 ++--
 hw/scsi/virtio-scsi.c         |  2 +-
 io/net-listener.c             | 10 +++++-----
 target/i386/cpu.c             |  3 ++-
 target/i386/emulate/x86_mmu.c |  4 ++--
 9 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/block/blkio.c b/block/blkio.c
index d2ba2a4d58dc..f7cb6e0b57d4 100644
--- a/block/blkio.c
+++ b/block/blkio.c
@@ -278,7 +278,7 @@ static bool blkio_completion_fd_poll(void *opaque)
 {
     BlockDriverState *bs = opaque;
     BDRVBlkioState *s = bs->opaque;
-    int ret;
+    int ret = -1;
 
     /* Just in case we already fetched a completion */
     if (s->poll_completion.user_data != NULL) {
@@ -559,7 +559,7 @@ static bool blkio_register_buf(BlockDriverState *bs, void *host, size_t size,
     BDRVBlkioState *s = bs->opaque;
     struct blkio_mem_region region;
     BlkioMemRegionResult region_result;
-    int ret;
+    int ret = -1;
 
     /*
      * Mapping memory regions conflicts with RAM discard (virtio-mem) when
diff --git a/block/qcow2.c b/block/qcow2.c
index 19271b10a49f..639593d737c8 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -838,7 +838,7 @@ static const char *overlap_bool_option_names[QCOW2_OL_MAX_BITNR] = {
 static void coroutine_fn cache_clean_timer(void *opaque)
 {
     BDRVQcow2State *s = opaque;
-    uint64_t wait_ns;
+    uint64_t wait_ns = 0;
 
     WITH_QEMU_LOCK_GUARD(&s->lock) {
         wait_ns = s->cache_clean_interval * NANOSECONDS_PER_SECOND;
diff --git a/hw/cxl/cxl-host.c b/hw/cxl/cxl-host.c
index 7e744312f1d8..eba13c9e7cba 100644
--- a/hw/cxl/cxl-host.c
+++ b/hw/cxl/cxl-host.c
@@ -279,7 +279,7 @@ static void cxl_fmws_direct_passthrough_setup(CXLDirectPTState *state,
     MemoryRegion *mr = NULL;
     uint64_t vmr_size = 0, pmr_size = 0, offset = 0;
     MemoryRegion *direct_mr;
-    g_autofree char *direct_mr_name;
+    g_autofree char *direct_mr_name = NULL;
     unsigned int idx = state->hdm_decoder_idx;
 
     if (ct3d->hostvmem) {
diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
index 1b0cce128c5e..82dc75cb7d10 100644
--- a/hw/scsi/scsi-disk.c
+++ b/hw/scsi/scsi-disk.c
@@ -3263,7 +3263,7 @@ static bool scsi_disk_pr_state_needed(void *opaque)
 {
     SCSIDiskState *s = opaque;
     SCSIPRState *pr_state = &s->qdev.pr_state;
-    bool ret;
+    bool ret = false;
 
     if (!s->qdev.migrate_pr) {
         return false;
diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c
index 8999f3b72006..b044561ae2dd 100644
--- a/hw/scsi/scsi-generic.c
+++ b/hw/scsi/scsi-generic.c
@@ -553,8 +553,8 @@ bool scsi_generic_pr_state_preempt(SCSIDevice *s, Error **errp)
     SCSIPRState *pr_state = &s->pr_state;
     Error *local_err = NULL;
     bool check_stale_key = true;
-    uint64_t key;
-    uint8_t resv_type;
+    uint64_t key = 0;
+    uint8_t resv_type = 0;
 
     /* Get the migrated PR state */
     WITH_QEMU_LOCK_GUARD(&pr_state->mutex) {
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index 6c7376801190..833f773d7f6c 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -1093,7 +1093,7 @@ static void virtio_scsi_push_event(VirtIOSCSI *s,
 
 static void virtio_scsi_handle_event_vq(VirtIOSCSI *s, VirtQueue *vq)
 {
-    bool events_dropped;
+    bool events_dropped = false;
 
     WITH_QEMU_LOCK_GUARD(&s->event_lock) {
         events_dropped = s->events_dropped;
diff --git a/io/net-listener.c b/io/net-listener.c
index 1fd0f6cb5ab8..8df19c35bd8f 100644
--- a/io/net-listener.c
+++ b/io/net-listener.c
@@ -54,11 +54,11 @@ static gboolean qio_net_listener_channel_func(QIOChannel *ioc,
                                               gpointer opaque)
 {
     QIONetListener *listener = QIO_NET_LISTENER(opaque);
-    QIOChannelSocket *sioc;
-    QIONetListenerClientFunc io_func;
-    gpointer io_data;
-    GMainContext *context;
-    AioContext *aio_context;
+    QIOChannelSocket *sioc = NULL;
+    QIONetListenerClientFunc io_func = NULL;
+    gpointer io_data = NULL;
+    GMainContext *context = NULL;
+    AioContext *aio_context = NULL;
 
     sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
                                      NULL);
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 5805d33ab92d..e9759ab25077 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -7734,7 +7734,7 @@ static void x86_cpuid_get_avx10_version(Object *obj, Visitor *v,
 static bool x86_cpu_apply_avx10_features(X86CPU *cpu, uint8_t version,
                                          Error **errp)
 {
-    const AVX10VersionDefinition *def;
+    const AVX10VersionDefinition *def = NULL;
     CPUX86State *env = &cpu->env;
 
     if (!version) {
@@ -7758,6 +7758,7 @@ static bool x86_cpu_apply_avx10_features(X86CPU *cpu, uint8_t version,
         }
     }
 
+    assert(def != NULL);
     if (def->version < version) {
         error_setg(errp, "avx10-version can be at most %d", def->version);
         return false;
diff --git a/target/i386/emulate/x86_mmu.c b/target/i386/emulate/x86_mmu.c
index 8d4371467fd7..c1cb385b3228 100644
--- a/target/i386/emulate/x86_mmu.c
+++ b/target/i386/emulate/x86_mmu.c
@@ -185,8 +185,8 @@ static MMUTranslateResult walk_gpt(CPUState *cpu, target_ulong addr, MMUTranslat
     int largeness = 0;
     target_ulong cr3 = x86_read_cr(cpu, 3);
     uint64_t page_mask = pae ? PAE_PTE_PAGE_MASK : LEGACY_PTE_PAGE_MASK;
-    MMUTranslateResult res;
-    
+    MMUTranslateResult res = 0;
+
     memset(pt, 0, sizeof(*pt));
     top_level = gpt_top_level(cpu, pae);
 

-- 
2.55.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 4/7] hw/hexagon: fix machine->fdt leak in qom-test
  2026-07-25 14:00 [PATCH 0/7] Fixes for 11.1 Marc-André Lureau
                   ` (2 preceding siblings ...)
  2026-07-25 14:00 ` [PATCH 3/7] Fix many -Werror=maybe-uninitialized Marc-André Lureau
@ 2026-07-25 14:00 ` Marc-André Lureau
  2026-07-27  6:41   ` Philippe Mathieu-Daudé
  2026-07-27 15:14   ` Brian Cain
  2026-07-25 14:00 ` [PATCH 5/7] hw/core/machine: free machine->fdt in machine_finalize() Marc-André Lureau
                   ` (2 subsequent siblings)
  6 siblings, 2 replies; 19+ messages in thread
From: Marc-André Lureau @ 2026-07-25 14:00 UTC (permalink / raw)
  To: qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Akihiko Odaki,
	Dmitry Osipenko, Stefan Hajnoczi, Kevin Wolf, Hanna Reitz,
	qemu-block, Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas, Marc-André Lureau

virt_instance_init() built the FDT unconditionally at QOM
instance-init time, so simply instantiating the object (e.g. via
qom-test's introspection, without ever realizing the machine) leaked
the 1MB FDT blob: machine_finalize() does not free machine->fdt.

Other boards (arm/virt, riscv/virt, ...) build the FDT lazily from
their MachineClass::init callback, which only runs when the machine
is actually selected to boot. Do the same here by moving create_fdt()
into virt_init().

Fixes: 88a8bc7f43ff ("hw/hexagon: Define hexagon "virt" machine")
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/hexagon/virt.c | 9 +--------
 1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c
index a3638998b873..b75047250260 100644
--- a/hw/hexagon/virt.c
+++ b/hw/hexagon/virt.c
@@ -175,13 +175,6 @@ static void fdt_add_cpu_nodes(const HexagonVirtMachineState *vms)
 
 
 
-static void virt_instance_init(Object *obj)
-{
-    HexagonVirtMachineState *vms = HEXAGON_VIRT_MACHINE(obj);
-
-    create_fdt(vms);
-}
-
 void hexagon_load_fdt(const HexagonVirtMachineState *vms)
 {
     MachineState *ms = MACHINE(vms);
@@ -242,6 +235,7 @@ static void virt_init(MachineState *ms)
     DeviceState *cpu0;
     int32_t clk_phandle;
 
+    create_fdt(vms);
     qemu_fdt_setprop_string(ms->fdt, "/chosen", "bootargs", ms->kernel_cmdline);
 
     vms->sys = get_system_memory();
@@ -341,7 +335,6 @@ static const TypeInfo virt_machine_types[] = { {
     .parent = TYPE_HEXAGON_COMMON_MACHINE,
     .instance_size = sizeof(HexagonVirtMachineState),
     .class_init = virt_class_init,
-    .instance_init = virt_instance_init,
 } };
 
 DEFINE_TYPES(virt_machine_types)

-- 
2.55.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 5/7] hw/core/machine: free machine->fdt in machine_finalize()
  2026-07-25 14:00 [PATCH 0/7] Fixes for 11.1 Marc-André Lureau
                   ` (3 preceding siblings ...)
  2026-07-25 14:00 ` [PATCH 4/7] hw/hexagon: fix machine->fdt leak in qom-test Marc-André Lureau
@ 2026-07-25 14:00 ` Marc-André Lureau
  2026-07-26  8:54   ` Akihiko Odaki
  2026-07-25 14:00 ` [PATCH 6/7] migration/multifd: fix Error leak in multifd_recv_terminate_threads() Marc-André Lureau
  2026-07-25 14:00 ` [PATCH 7/7] qdev-monitor: drain RCU callbacks in qdev_device_add_from_qdict Marc-André Lureau
  6 siblings, 1 reply; 19+ messages in thread
From: Marc-André Lureau @ 2026-07-25 14:00 UTC (permalink / raw)
  To: qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Akihiko Odaki,
	Dmitry Osipenko, Stefan Hajnoczi, Kevin Wolf, Hanna Reitz,
	qemu-block, Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas, Marc-André Lureau

machine->fdt is a plain g_malloc0() buffer (see create_device_tree())
that boards populate during MachineClass::init, but machine_finalize()
never freed it, unlike the other boot-time buffers (dtb, dumpdtb,
kernel_filename, ...). Free it for consistency.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 hw/core/machine.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/core/machine.c b/hw/core/machine.c
index 805148678d57..2b24d711d76f 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -1301,6 +1301,7 @@ static void machine_finalize(Object *obj)
     g_free(ms->kernel_cmdline);
     g_free(ms->dtb);
     g_free(ms->dumpdtb);
+    g_free(ms->fdt);
     g_free(ms->dt_compatible);
     g_free(ms->firmware);
     g_free(ms->device_memory);

-- 
2.55.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 6/7] migration/multifd: fix Error leak in multifd_recv_terminate_threads()
  2026-07-25 14:00 [PATCH 0/7] Fixes for 11.1 Marc-André Lureau
                   ` (4 preceding siblings ...)
  2026-07-25 14:00 ` [PATCH 5/7] hw/core/machine: free machine->fdt in machine_finalize() Marc-André Lureau
@ 2026-07-25 14:00 ` Marc-André Lureau
  2026-07-25 14:00 ` [PATCH 7/7] qdev-monitor: drain RCU callbacks in qdev_device_add_from_qdict Marc-André Lureau
  6 siblings, 0 replies; 19+ messages in thread
From: Marc-André Lureau @ 2026-07-25 14:00 UTC (permalink / raw)
  To: qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Akihiko Odaki,
	Dmitry Osipenko, Stefan Hajnoczi, Kevin Wolf, Hanna Reitz,
	qemu-block, Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas, Marc-André Lureau

If err != NULL, free it.

Fixes: 11dd7be57524 ("migration/multifd: Remove p->quit from recv side")
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 migration/multifd.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/migration/multifd.c b/migration/multifd.c
index dbad525d2a28..503014f76ba5 100644
--- a/migration/multifd.c
+++ b/migration/multifd.c
@@ -1056,6 +1056,7 @@ static void multifd_recv_terminate_threads(Error *err)
     trace_multifd_recv_terminate_threads(err != NULL);
 
     if (qatomic_xchg(&multifd_recv_state->exiting, 1)) {
+        error_free(err);
         return;
     }
 

-- 
2.55.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 7/7] qdev-monitor: drain RCU callbacks in qdev_device_add_from_qdict
  2026-07-25 14:00 [PATCH 0/7] Fixes for 11.1 Marc-André Lureau
                   ` (5 preceding siblings ...)
  2026-07-25 14:00 ` [PATCH 6/7] migration/multifd: fix Error leak in multifd_recv_terminate_threads() Marc-André Lureau
@ 2026-07-25 14:00 ` Marc-André Lureau
  2026-07-26  7:31   ` Akihiko Odaki
  6 siblings, 1 reply; 19+ messages in thread
From: Marc-André Lureau @ 2026-07-25 14:00 UTC (permalink / raw)
  To: qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Akihiko Odaki,
	Dmitry Osipenko, Stefan Hajnoczi, Kevin Wolf, Hanna Reitz,
	qemu-block, Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas, Marc-André Lureau

qmp_device_add() and hmp_device_add() drain pending RCU callbacks after
a failed device_add, since some bus teardown (e.g. bus_remove_child())
is deferred to call_rcu(). -device on the command line reaches the same
qdev_device_add_from_qdict() with errp pointing at error_fatal, whose
ERRP_GUARD() exits before control returns to the caller, so the caller's
drain_call_rcu() never runs.

Move the drain into qdev_device_add_from_qdict()'s own err_del_dev path
so it always runs, and drop the now-redundant calls in qmp_device_add()
and hmp_device_add().

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 system/qdev-monitor.c | 33 ++++++++++-----------------------
 1 file changed, 10 insertions(+), 23 deletions(-)

diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
index 00fed791cce1..884d407d60d4 100644
--- a/system/qdev-monitor.c
+++ b/system/qdev-monitor.c
@@ -746,6 +746,16 @@ err_del_dev:
     object_unparent(OBJECT(dev));
     object_unref(OBJECT(dev));
 
+    /*
+     * Drain all pending RCU callbacks. This is done because some bus
+     * related operations can delay a device removal (in this case this
+     * can happen if device is added and then removed due to a
+     * configuration error) to a RCU callback, but a caller might expect
+     * the failed device to be fully torn down once this function
+     * returns.
+     */
+    drain_call_rcu();
+
     return NULL;
 }
 
@@ -870,18 +880,6 @@ void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
     DeviceState *dev;
 
     dev = qdev_device_add_from_qdict(qdict, true, errp);
-    if (!dev) {
-        /*
-         * Drain all pending RCU callbacks. This is done because
-         * some bus related operations can delay a device removal
-         * (in this case this can happen if device is added and then
-         * removed due to a configuration error)
-         * to a RCU callback, but user might expect that this interface
-         * will finish its job completely once qmp command returns result
-         * to the user
-         */
-        drain_call_rcu();
-    }
     object_unref(OBJECT(dev));
 }
 
@@ -1017,17 +1015,6 @@ void hmp_device_add(Monitor *mon, const QDict *qdict)
     }
     dev = qdev_device_add(opts, &err);
     if (!dev) {
-        /*
-         * Drain all pending RCU callbacks. This is done because
-         * some bus related operations can delay a device removal
-         * (in this case this can happen if device is added and then
-         * removed due to a configuration error)
-         * to a RCU callback, but user might expect that this interface
-         * will finish its job completely once qmp command returns result
-         * to the user
-         */
-        drain_call_rcu();
-
         qemu_opts_del(opts);
     }
     object_unref(dev);

-- 
2.55.0


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH 7/7] qdev-monitor: drain RCU callbacks in qdev_device_add_from_qdict
  2026-07-25 14:00 ` [PATCH 7/7] qdev-monitor: drain RCU callbacks in qdev_device_add_from_qdict Marc-André Lureau
@ 2026-07-26  7:31   ` Akihiko Odaki
  0 siblings, 0 replies; 19+ messages in thread
From: Akihiko Odaki @ 2026-07-26  7:31 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Dmitry Osipenko,
	Stefan Hajnoczi, Kevin Wolf, Hanna Reitz, qemu-block,
	Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas

On 2026/07/25 23:00, Marc-André Lureau wrote:
> qmp_device_add() and hmp_device_add() drain pending RCU callbacks after
> a failed device_add, since some bus teardown (e.g. bus_remove_child())
> is deferred to call_rcu(). -device on the command line reaches the same
> qdev_device_add_from_qdict() with errp pointing at error_fatal, whose
> ERRP_GUARD() exits before control returns to the caller, so the caller's
> drain_call_rcu() never runs.
> 
> Move the drain into qdev_device_add_from_qdict()'s own err_del_dev path
> so it always runs, and drop the now-redundant calls in qmp_device_add()
> and hmp_device_add().

It is reachable from virtio-net failover during guest feature 
negotiation. MMIO dispatch holds an RCU read lock at 
address_space_write(). If deferred primary creation fails, 
drain_call_rcu() waits for a grace period while its own thread remains a 
reader, deadlocking the VM.

Regards,
Akihiko Odaki

> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   system/qdev-monitor.c | 33 ++++++++++-----------------------
>   1 file changed, 10 insertions(+), 23 deletions(-)
> 
> diff --git a/system/qdev-monitor.c b/system/qdev-monitor.c
> index 00fed791cce1..884d407d60d4 100644
> --- a/system/qdev-monitor.c
> +++ b/system/qdev-monitor.c
> @@ -746,6 +746,16 @@ err_del_dev:
>       object_unparent(OBJECT(dev));
>       object_unref(OBJECT(dev));
>   
> +    /*
> +     * Drain all pending RCU callbacks. This is done because some bus
> +     * related operations can delay a device removal (in this case this
> +     * can happen if device is added and then removed due to a
> +     * configuration error) to a RCU callback, but a caller might expect
> +     * the failed device to be fully torn down once this function
> +     * returns.
> +     */
> +    drain_call_rcu();
> +
>       return NULL;
>   }
>   
> @@ -870,18 +880,6 @@ void qmp_device_add(QDict *qdict, QObject **ret_data, Error **errp)
>       DeviceState *dev;
>   
>       dev = qdev_device_add_from_qdict(qdict, true, errp);
> -    if (!dev) {
> -        /*
> -         * Drain all pending RCU callbacks. This is done because
> -         * some bus related operations can delay a device removal
> -         * (in this case this can happen if device is added and then
> -         * removed due to a configuration error)
> -         * to a RCU callback, but user might expect that this interface
> -         * will finish its job completely once qmp command returns result
> -         * to the user
> -         */
> -        drain_call_rcu();
> -    }
>       object_unref(OBJECT(dev));
>   }
>   
> @@ -1017,17 +1015,6 @@ void hmp_device_add(Monitor *mon, const QDict *qdict)
>       }
>       dev = qdev_device_add(opts, &err);
>       if (!dev) {
> -        /*
> -         * Drain all pending RCU callbacks. This is done because
> -         * some bus related operations can delay a device removal
> -         * (in this case this can happen if device is added and then
> -         * removed due to a configuration error)
> -         * to a RCU callback, but user might expect that this interface
> -         * will finish its job completely once qmp command returns result
> -         * to the user
> -         */
> -        drain_call_rcu();
> -
>           qemu_opts_del(opts);
>       }
>       object_unref(dev);
> 


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 1/7] hw/display/virtio-gpu-rutabaga: zero-init capset info response
  2026-07-25 14:00 ` [PATCH 1/7] hw/display/virtio-gpu-rutabaga: zero-init capset info response Marc-André Lureau
@ 2026-07-26  7:32   ` Akihiko Odaki
  2026-07-26  8:24     ` Marc-André Lureau
  0 siblings, 1 reply; 19+ messages in thread
From: Akihiko Odaki @ 2026-07-26  7:32 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Dmitry Osipenko,
	Stefan Hajnoczi, Kevin Wolf, Hanna Reitz, qemu-block,
	Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas, Haotian Jiang

On 2026/07/25 23:00, Marc-André Lureau wrote:
> rutabaga_cmd_get_capset_info() only fills in capset_id,
> capset_max_version and capset_max_size before sending the response to
> the guest. The remaining fields of struct virtio_gpu_resp_capset_info,
> including hdr.fence_id, hdr.ctx_id and hdr.ring_idx, are left with
> stack garbage and leaked to the guest, including host pointers useful
> for an ASLR bypass.
> 
> Zero the response first, matching virgl_cmd_get_capset_info().
> 
> Not a real risk thanks to -ftrivial-auto-var-init=zero.

GCC only added -ftrivial-auto-var-init=zero in GCC 12, while QEMU still 
supports GCC 10.4/11.

Regards,
Akihiko Odaki

> 
> Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3609
> Fixes: 1dcc6adbc168 ("gfxstream + rutabaga: add initial support for gfxstream")
> Reported-by: Haotian Jiang <jianghaotian.sunday@gmail.com>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   hw/display/virtio-gpu-rutabaga.c | 2 ++
>   1 file changed, 2 insertions(+)
> 
> diff --git a/hw/display/virtio-gpu-rutabaga.c b/hw/display/virtio-gpu-rutabaga.c
> index 4d7d7b245929..95a19eed7eda 100644
> --- a/hw/display/virtio-gpu-rutabaga.c
> +++ b/hw/display/virtio-gpu-rutabaga.c
> @@ -555,6 +555,8 @@ rutabaga_cmd_get_capset_info(VirtIOGPU *g, struct virtio_gpu_ctrl_command *cmd)
>   
>       VIRTIO_GPU_FILL_CMD(info);
>   
> +    memset(&resp, 0, sizeof(resp));
> +
>       result = rutabaga_get_capset_info(vr->rutabaga, info.capset_index,
>                                         &resp.capset_id, &resp.capset_max_version,
>                                         &resp.capset_max_size);
> 


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 2/7] block/blkio: fix error return value on getlength()
  2026-07-25 14:00 ` [PATCH 2/7] block/blkio: fix error return value on getlength() Marc-André Lureau
@ 2026-07-26  7:36   ` Akihiko Odaki
  0 siblings, 0 replies; 19+ messages in thread
From: Akihiko Odaki @ 2026-07-26  7:36 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Dmitry Osipenko,
	Stefan Hajnoczi, Kevin Wolf, Hanna Reitz, qemu-block,
	Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas

On 2026/07/25 23:00, Marc-André Lureau wrote:
> Negative values should be return for errors.

Nit: s/return/returned/

> 
> It also helps with GCC false-positives:
> ../block/blkio.c: In function ‘blkio_co_getlength’:
> ../block/blkio.c:943:8: error: ‘ret’ may be used uninitialized [-Werror=maybe-uninitialized]
>    943 |     if (ret < 0) {
>        |        ^
> 
> Fixes: fd66dbd424 ("blkio: add libblkio block driver")
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   block/blkio.c | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/block/blkio.c b/block/blkio.c
> index fb8bec27d71a..d2ba2a4d58dc 100644
> --- a/block/blkio.c
> +++ b/block/blkio.c
> @@ -935,13 +935,13 @@ static int64_t coroutine_fn blkio_co_getlength(BlockDriverState *bs)
>   {
>       BDRVBlkioState *s = bs->opaque;
>       uint64_t capacity;
> -    int ret;
> +    int ret = -1;

Initializing a variable with a dummy value can suppress a useful 
warning. Replacing WITH_QEMU_LOCK_GUARD() with QEMU_LOCK_GUARD() will 
fix it without introducing a dummy value and also result in a bit 
simpler code.

Regards,
Akihiko Odaki

>   
>       WITH_QEMU_LOCK_GUARD(&s->blkio_lock) {
>           ret = blkio_get_uint64(s->blkio, "capacity", &capacity);
>       }
>       if (ret < 0) {
> -        return -ret;
> +        return ret;
>       }
>   
>       return capacity;
> 


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 1/7] hw/display/virtio-gpu-rutabaga: zero-init capset info response
  2026-07-26  7:32   ` Akihiko Odaki
@ 2026-07-26  8:24     ` Marc-André Lureau
  2026-07-26  8:33       ` Akihiko Odaki
  2026-07-27 11:05       ` Daniel P. Berrangé
  0 siblings, 2 replies; 19+ messages in thread
From: Marc-André Lureau @ 2026-07-26  8:24 UTC (permalink / raw)
  To: Akihiko Odaki, P. Berrange, Daniel
  Cc: qemu-devel, Michael S. Tsirkin, Alex Bennée, Dmitry Osipenko,
	Stefan Hajnoczi, Kevin Wolf, Hanna Reitz, qemu-block,
	Jonathan Cameron, Paolo Bonzini, Fam Zheng, Zhao Liu,
	Roman Bolshakov, Phil Dennis-Jordan, Wei Liu, linux-cxl,
	Brian Cain, Pierrick Bouvier, Philippe Mathieu-Daudé,
	Peter Xu, Fabiano Rosas, Haotian Jiang

Hi

On Sun, Jul 26, 2026 at 11:33 AM Akihiko Odaki
<odaki@rsg.ci.i.u-tokyo.ac.jp> wrote:
>
> On 2026/07/25 23:00, Marc-André Lureau wrote:
> > rutabaga_cmd_get_capset_info() only fills in capset_id,
> > capset_max_version and capset_max_size before sending the response to
> > the guest. The remaining fields of struct virtio_gpu_resp_capset_info,
> > including hdr.fence_id, hdr.ctx_id and hdr.ring_idx, are left with
> > stack garbage and leaked to the guest, including host pointers useful
> > for an ASLR bypass.
> >
> > Zero the response first, matching virgl_cmd_get_capset_info().
> >
> > Not a real risk thanks to -ftrivial-auto-var-init=zero.
>
> GCC only added -ftrivial-auto-var-init=zero in GCC 12, while QEMU still
> supports GCC 10.4/11.
>

Good point, may be we should update:
https://patchew.org/QEMU/20260723094622.1515831-1-berrange@redhat.com/

ack otherwise?

> Regards,
> Akihiko Odaki
>
> >
> > Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3609
> > Fixes: 1dcc6adbc168 ("gfxstream + rutabaga: add initial support for gfxstream")
> > Reported-by: Haotian Jiang <jianghaotian.sunday@gmail.com>
> > Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> > ---
> >   hw/display/virtio-gpu-rutabaga.c | 2 ++
> >   1 file changed, 2 insertions(+)
> >
> > diff --git a/hw/display/virtio-gpu-rutabaga.c b/hw/display/virtio-gpu-rutabaga.c
> > index 4d7d7b245929..95a19eed7eda 100644
> > --- a/hw/display/virtio-gpu-rutabaga.c
> > +++ b/hw/display/virtio-gpu-rutabaga.c
> > @@ -555,6 +555,8 @@ rutabaga_cmd_get_capset_info(VirtIOGPU *g, struct virtio_gpu_ctrl_command *cmd)
> >
> >       VIRTIO_GPU_FILL_CMD(info);
> >
> > +    memset(&resp, 0, sizeof(resp));
> > +
> >       result = rutabaga_get_capset_info(vr->rutabaga, info.capset_index,
> >                                         &resp.capset_id, &resp.capset_max_version,
> >                                         &resp.capset_max_size);
> >
>


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 3/7] Fix many -Werror=maybe-uninitialized
  2026-07-25 14:00 ` [PATCH 3/7] Fix many -Werror=maybe-uninitialized Marc-André Lureau
@ 2026-07-26  8:29   ` Akihiko Odaki
  0 siblings, 0 replies; 19+ messages in thread
From: Akihiko Odaki @ 2026-07-26  8:29 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Dmitry Osipenko,
	Stefan Hajnoczi, Kevin Wolf, Hanna Reitz, qemu-block,
	Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas

On 2026/07/25 23:00, Marc-André Lureau wrote:
> When compiled with -Og, gcc produces many false-positives
> gcc (GCC) 16.1.1 20260515 (Red Hat 16.1.1-2).
> 
> We already use auto-var-init=zero, but better be explicit.

I'm kind of reluctant to describe it is more explicit and it is better. 
The variables causing the false positives do not contain a useful value 
until later assignments. Initializing them obscures the fact and 
suppresses useful warnings. This patch may serve as a workaround, but 
its scope should be minimized.

I think WITH_QEMU_LOCK_GUARD() should be fixed to explicitly tell that 
the block is unconditionally executed. Linux does so, for example:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fcc22ac5baf06dd17193de44b60dbceea6461983
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   block/blkio.c                 |  4 ++--
>   block/qcow2.c                 |  2 +-
>   hw/cxl/cxl-host.c             |  2 +-
>   hw/scsi/scsi-disk.c           |  2 +-
>   hw/scsi/scsi-generic.c        |  4 ++--
>   hw/scsi/virtio-scsi.c         |  2 +-
>   io/net-listener.c             | 10 +++++-----
>   target/i386/cpu.c             |  3 ++-
>   target/i386/emulate/x86_mmu.c |  4 ++--
>   9 files changed, 17 insertions(+), 16 deletions(-)
> 
> diff --git a/block/blkio.c b/block/blkio.c
> index d2ba2a4d58dc..f7cb6e0b57d4 100644
> --- a/block/blkio.c
> +++ b/block/blkio.c
> @@ -278,7 +278,7 @@ static bool blkio_completion_fd_poll(void *opaque)
>   {
>       BlockDriverState *bs = opaque;
>       BDRVBlkioState *s = bs->opaque;
> -    int ret;
> +    int ret = -1;
>   
>       /* Just in case we already fetched a completion */
>       if (s->poll_completion.user_data != NULL) {
> @@ -559,7 +559,7 @@ static bool blkio_register_buf(BlockDriverState *bs, void *host, size_t size,
>       BDRVBlkioState *s = bs->opaque;
>       struct blkio_mem_region region;
>       BlkioMemRegionResult region_result;
> -    int ret;
> +    int ret = -1;
>   
>       /*
>        * Mapping memory regions conflicts with RAM discard (virtio-mem) when
> diff --git a/block/qcow2.c b/block/qcow2.c
> index 19271b10a49f..639593d737c8 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -838,7 +838,7 @@ static const char *overlap_bool_option_names[QCOW2_OL_MAX_BITNR] = {
>   static void coroutine_fn cache_clean_timer(void *opaque)
>   {
>       BDRVQcow2State *s = opaque;
> -    uint64_t wait_ns;
> +    uint64_t wait_ns = 0;
>   
>       WITH_QEMU_LOCK_GUARD(&s->lock) {
>           wait_ns = s->cache_clean_interval * NANOSECONDS_PER_SECOND;
> diff --git a/hw/cxl/cxl-host.c b/hw/cxl/cxl-host.c
> index 7e744312f1d8..eba13c9e7cba 100644
> --- a/hw/cxl/cxl-host.c
> +++ b/hw/cxl/cxl-host.c
> @@ -279,7 +279,7 @@ static void cxl_fmws_direct_passthrough_setup(CXLDirectPTState *state,
>       MemoryRegion *mr = NULL;
>       uint64_t vmr_size = 0, pmr_size = 0, offset = 0;
>       MemoryRegion *direct_mr;
> -    g_autofree char *direct_mr_name;
> +    g_autofree char *direct_mr_name = NULL;

This fixes a real issue, not a false positive. An early return can 
trigger a cleanup on an uninitialized variable.

Regards,
Akihiko Odaki

>       unsigned int idx = state->hdm_decoder_idx;
>   
>       if (ct3d->hostvmem) {
> diff --git a/hw/scsi/scsi-disk.c b/hw/scsi/scsi-disk.c
> index 1b0cce128c5e..82dc75cb7d10 100644
> --- a/hw/scsi/scsi-disk.c
> +++ b/hw/scsi/scsi-disk.c
> @@ -3263,7 +3263,7 @@ static bool scsi_disk_pr_state_needed(void *opaque)
>   {
>       SCSIDiskState *s = opaque;
>       SCSIPRState *pr_state = &s->qdev.pr_state;
> -    bool ret;
> +    bool ret = false;
>   
>       if (!s->qdev.migrate_pr) {
>           return false;
> diff --git a/hw/scsi/scsi-generic.c b/hw/scsi/scsi-generic.c
> index 8999f3b72006..b044561ae2dd 100644
> --- a/hw/scsi/scsi-generic.c
> +++ b/hw/scsi/scsi-generic.c
> @@ -553,8 +553,8 @@ bool scsi_generic_pr_state_preempt(SCSIDevice *s, Error **errp)
>       SCSIPRState *pr_state = &s->pr_state;
>       Error *local_err = NULL;
>       bool check_stale_key = true;
> -    uint64_t key;
> -    uint8_t resv_type;
> +    uint64_t key = 0;
> +    uint8_t resv_type = 0;
>   
>       /* Get the migrated PR state */
>       WITH_QEMU_LOCK_GUARD(&pr_state->mutex) {
> diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
> index 6c7376801190..833f773d7f6c 100644
> --- a/hw/scsi/virtio-scsi.c
> +++ b/hw/scsi/virtio-scsi.c
> @@ -1093,7 +1093,7 @@ static void virtio_scsi_push_event(VirtIOSCSI *s,
>   
>   static void virtio_scsi_handle_event_vq(VirtIOSCSI *s, VirtQueue *vq)
>   {
> -    bool events_dropped;
> +    bool events_dropped = false;
>   
>       WITH_QEMU_LOCK_GUARD(&s->event_lock) {
>           events_dropped = s->events_dropped;
> diff --git a/io/net-listener.c b/io/net-listener.c
> index 1fd0f6cb5ab8..8df19c35bd8f 100644
> --- a/io/net-listener.c
> +++ b/io/net-listener.c
> @@ -54,11 +54,11 @@ static gboolean qio_net_listener_channel_func(QIOChannel *ioc,
>                                                 gpointer opaque)
>   {
>       QIONetListener *listener = QIO_NET_LISTENER(opaque);
> -    QIOChannelSocket *sioc;
> -    QIONetListenerClientFunc io_func;
> -    gpointer io_data;
> -    GMainContext *context;
> -    AioContext *aio_context;
> +    QIOChannelSocket *sioc = NULL;
> +    QIONetListenerClientFunc io_func = NULL;
> +    gpointer io_data = NULL;
> +    GMainContext *context = NULL;
> +    AioContext *aio_context = NULL;
>   
>       sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(ioc),
>                                        NULL);
> diff --git a/target/i386/cpu.c b/target/i386/cpu.c
> index 5805d33ab92d..e9759ab25077 100644
> --- a/target/i386/cpu.c
> +++ b/target/i386/cpu.c
> @@ -7734,7 +7734,7 @@ static void x86_cpuid_get_avx10_version(Object *obj, Visitor *v,
>   static bool x86_cpu_apply_avx10_features(X86CPU *cpu, uint8_t version,
>                                            Error **errp)
>   {
> -    const AVX10VersionDefinition *def;
> +    const AVX10VersionDefinition *def = NULL;
>       CPUX86State *env = &cpu->env;
>   
>       if (!version) {
> @@ -7758,6 +7758,7 @@ static bool x86_cpu_apply_avx10_features(X86CPU *cpu, uint8_t version,
>           }
>       }
>   
> +    assert(def != NULL);
>       if (def->version < version) {
>           error_setg(errp, "avx10-version can be at most %d", def->version);
>           return false;
> diff --git a/target/i386/emulate/x86_mmu.c b/target/i386/emulate/x86_mmu.c
> index 8d4371467fd7..c1cb385b3228 100644
> --- a/target/i386/emulate/x86_mmu.c
> +++ b/target/i386/emulate/x86_mmu.c
> @@ -185,8 +185,8 @@ static MMUTranslateResult walk_gpt(CPUState *cpu, target_ulong addr, MMUTranslat
>       int largeness = 0;
>       target_ulong cr3 = x86_read_cr(cpu, 3);
>       uint64_t page_mask = pae ? PAE_PTE_PAGE_MASK : LEGACY_PTE_PAGE_MASK;
> -    MMUTranslateResult res;
> -
> +    MMUTranslateResult res = 0;
> +
>       memset(pt, 0, sizeof(*pt));
>       top_level = gpt_top_level(cpu, pae);
>   
> 


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 1/7] hw/display/virtio-gpu-rutabaga: zero-init capset info response
  2026-07-26  8:24     ` Marc-André Lureau
@ 2026-07-26  8:33       ` Akihiko Odaki
  2026-07-27 11:05       ` Daniel P. Berrangé
  1 sibling, 0 replies; 19+ messages in thread
From: Akihiko Odaki @ 2026-07-26  8:33 UTC (permalink / raw)
  To: Marc-André Lureau, P. Berrange, Daniel
  Cc: qemu-devel, Michael S. Tsirkin, Alex Bennée, Dmitry Osipenko,
	Stefan Hajnoczi, Kevin Wolf, Hanna Reitz, qemu-block,
	Jonathan Cameron, Paolo Bonzini, Fam Zheng, Zhao Liu,
	Roman Bolshakov, Phil Dennis-Jordan, Wei Liu, linux-cxl,
	Brian Cain, Pierrick Bouvier, Philippe Mathieu-Daudé,
	Peter Xu, Fabiano Rosas, Haotian Jiang

On 2026/07/26 17:24, Marc-André Lureau wrote:
> Hi
> 
> On Sun, Jul 26, 2026 at 11:33 AM Akihiko Odaki
> <odaki@rsg.ci.i.u-tokyo.ac.jp> wrote:
>>
>> On 2026/07/25 23:00, Marc-André Lureau wrote:
>>> rutabaga_cmd_get_capset_info() only fills in capset_id,
>>> capset_max_version and capset_max_size before sending the response to
>>> the guest. The remaining fields of struct virtio_gpu_resp_capset_info,
>>> including hdr.fence_id, hdr.ctx_id and hdr.ring_idx, are left with
>>> stack garbage and leaked to the guest, including host pointers useful
>>> for an ASLR bypass.
>>>
>>> Zero the response first, matching virgl_cmd_get_capset_info().
>>>
>>> Not a real risk thanks to -ftrivial-auto-var-init=zero.
>>
>> GCC only added -ftrivial-auto-var-init=zero in GCC 12, while QEMU still
>> supports GCC 10.4/11.
>>
> 
> Good point, may be we should update:
> https://patchew.org/QEMU/20260723094622.1515831-1-berrange@redhat.com/
> 
> ack otherwise?

Yes:

Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>

Regards.
Akihiko Odaki

> 
>> Regards,
>> Akihiko Odaki
>>
>>>
>>> Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3609
>>> Fixes: 1dcc6adbc168 ("gfxstream + rutabaga: add initial support for gfxstream")
>>> Reported-by: Haotian Jiang <jianghaotian.sunday@gmail.com>
>>> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>>> ---
>>>    hw/display/virtio-gpu-rutabaga.c | 2 ++
>>>    1 file changed, 2 insertions(+)
>>>
>>> diff --git a/hw/display/virtio-gpu-rutabaga.c b/hw/display/virtio-gpu-rutabaga.c
>>> index 4d7d7b245929..95a19eed7eda 100644
>>> --- a/hw/display/virtio-gpu-rutabaga.c
>>> +++ b/hw/display/virtio-gpu-rutabaga.c
>>> @@ -555,6 +555,8 @@ rutabaga_cmd_get_capset_info(VirtIOGPU *g, struct virtio_gpu_ctrl_command *cmd)
>>>
>>>        VIRTIO_GPU_FILL_CMD(info);
>>>
>>> +    memset(&resp, 0, sizeof(resp));
>>> +
>>>        result = rutabaga_get_capset_info(vr->rutabaga, info.capset_index,
>>>                                          &resp.capset_id, &resp.capset_max_version,
>>>                                          &resp.capset_max_size);
>>>
>>
> 


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 5/7] hw/core/machine: free machine->fdt in machine_finalize()
  2026-07-25 14:00 ` [PATCH 5/7] hw/core/machine: free machine->fdt in machine_finalize() Marc-André Lureau
@ 2026-07-26  8:54   ` Akihiko Odaki
  0 siblings, 0 replies; 19+ messages in thread
From: Akihiko Odaki @ 2026-07-26  8:54 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Dmitry Osipenko,
	Stefan Hajnoczi, Kevin Wolf, Hanna Reitz, qemu-block,
	Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas

On 2026/07/25 23:00, Marc-André Lureau wrote:
> machine->fdt is a plain g_malloc0() buffer (see create_device_tree())
> that boards populate during MachineClass::init, but machine_finalize()
> never freed it, unlike the other boot-time buffers (dtb, dumpdtb,
> kernel_filename, ...). Free it for consistency.

This unfortunately converts an existing bug into double-free.

spapr_machine_reset() aliases machine->fdt to spapr->fdt_blob. 
spapr_dtb_pre_load() and h_update_dt() later free it via
spapr->fdt_blob, but does not update machine->fdt, making it dangling.

Leaving machine->fdt dangling is already a bug. 
do_client_architecture_support() explains that as follows:

     /*
      * Set the machine->fdt pointer again since we just freed
      * it above (by freeing spapr->fdt_blob). We set this
      * pointer to enable support for the 'dumpdtb' QMP/HMP
      * command.
      */
     MACHINE(spapr)->fdt = fdt;

This patch introduces another path to trigger the bug.

Regards,
Akihiko Odaki

> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   hw/core/machine.c | 1 +
>   1 file changed, 1 insertion(+)
> 
> diff --git a/hw/core/machine.c b/hw/core/machine.c
> index 805148678d57..2b24d711d76f 100644
> --- a/hw/core/machine.c
> +++ b/hw/core/machine.c
> @@ -1301,6 +1301,7 @@ static void machine_finalize(Object *obj)
>       g_free(ms->kernel_cmdline);
>       g_free(ms->dtb);
>       g_free(ms->dumpdtb);
> +    g_free(ms->fdt);
>       g_free(ms->dt_compatible);
>       g_free(ms->firmware);
>       g_free(ms->device_memory);
> 


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 4/7] hw/hexagon: fix machine->fdt leak in qom-test
  2026-07-25 14:00 ` [PATCH 4/7] hw/hexagon: fix machine->fdt leak in qom-test Marc-André Lureau
@ 2026-07-27  6:41   ` Philippe Mathieu-Daudé
  2026-07-27 15:14   ` Brian Cain
  1 sibling, 0 replies; 19+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-07-27  6:41 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Akihiko Odaki,
	Dmitry Osipenko, Stefan Hajnoczi, Kevin Wolf, Hanna Reitz,
	qemu-block, Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Brian Cain,
	Pierrick Bouvier, Philippe Mathieu-Daudé, Peter Xu,
	Fabiano Rosas

On 25/7/26 16:00, Marc-André Lureau wrote:
> virt_instance_init() built the FDT unconditionally at QOM
> instance-init time, so simply instantiating the object (e.g. via
> qom-test's introspection, without ever realizing the machine) leaked
> the 1MB FDT blob: machine_finalize() does not free machine->fdt.
> 
> Other boards (arm/virt, riscv/virt, ...) build the FDT lazily from
> their MachineClass::init callback, which only runs when the machine
> is actually selected to boot. Do the same here by moving create_fdt()
> into virt_init().
> 
> Fixes: 88a8bc7f43ff ("hw/hexagon: Define hexagon "virt" machine")
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>   hw/hexagon/virt.c | 9 +--------
>   1 file changed, 1 insertion(+), 8 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 1/7] hw/display/virtio-gpu-rutabaga: zero-init capset info response
  2026-07-26  8:24     ` Marc-André Lureau
  2026-07-26  8:33       ` Akihiko Odaki
@ 2026-07-27 11:05       ` Daniel P. Berrangé
  2026-07-27 11:20         ` Marc-André Lureau
  1 sibling, 1 reply; 19+ messages in thread
From: Daniel P. Berrangé @ 2026-07-27 11:05 UTC (permalink / raw)
  To: Marc-André Lureau
  Cc: Akihiko Odaki, qemu-devel, Michael S. Tsirkin, Alex Bennée,
	Dmitry Osipenko, Stefan Hajnoczi, Kevin Wolf, Hanna Reitz,
	qemu-block, Jonathan Cameron, Paolo Bonzini, Fam Zheng, Zhao Liu,
	Roman Bolshakov, Phil Dennis-Jordan, Wei Liu, linux-cxl,
	Brian Cain, Pierrick Bouvier, Philippe Mathieu-Daudé,
	Peter Xu, Fabiano Rosas, Haotian Jiang

On Sun, Jul 26, 2026 at 12:24:52PM +0400, Marc-André Lureau wrote:
> Hi
> 
> On Sun, Jul 26, 2026 at 11:33 AM Akihiko Odaki
> <odaki@rsg.ci.i.u-tokyo.ac.jp> wrote:
> >
> > On 2026/07/25 23:00, Marc-André Lureau wrote:
> > > rutabaga_cmd_get_capset_info() only fills in capset_id,
> > > capset_max_version and capset_max_size before sending the response to
> > > the guest. The remaining fields of struct virtio_gpu_resp_capset_info,
> > > including hdr.fence_id, hdr.ctx_id and hdr.ring_idx, are left with
> > > stack garbage and leaked to the guest, including host pointers useful
> > > for an ASLR bypass.
> > >
> > > Zero the response first, matching virgl_cmd_get_capset_info().
> > >
> > > Not a real risk thanks to -ftrivial-auto-var-init=zero.
> >
> > GCC only added -ftrivial-auto-var-init=zero in GCC 12, while QEMU still
> > supports GCC 10.4/11.

Opps, I thought we had new enough versions already.

> 
> Good point, may be we should update:
> https://patchew.org/QEMU/20260723094622.1515831-1-berrange@redhat.com/

I'm inclined to bump our min GCC/Clang versions so we can assume
zero-init.

We picked 10.5 due to NetBSD, and CentOS 9 still has 11.x

In both those cases, however, Clang is available in new enough
version to support -ftrivial-auto-var-init=zero. In NetBSD
there are also many new versions of GCC  available, only the
base system GCC is 10.5.


With regards,
Daniel
-- 
|: https://berrange.com       ~~        https://hachyderm.io/@berrange :|
|: https://libvirt.org          ~~          https://entangle-photo.org :|
|: https://pixelfed.art/berrange   ~~    https://fstop138.berrange.com :|


^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 1/7] hw/display/virtio-gpu-rutabaga: zero-init capset info response
  2026-07-27 11:05       ` Daniel P. Berrangé
@ 2026-07-27 11:20         ` Marc-André Lureau
  0 siblings, 0 replies; 19+ messages in thread
From: Marc-André Lureau @ 2026-07-27 11:20 UTC (permalink / raw)
  To: Daniel P. Berrangé
  Cc: Akihiko Odaki, qemu-devel, Michael S. Tsirkin, Alex Bennée,
	Dmitry Osipenko, Stefan Hajnoczi, Kevin Wolf, Hanna Reitz,
	qemu-block, Jonathan Cameron, Paolo Bonzini, Fam Zheng, Zhao Liu,
	Roman Bolshakov, Phil Dennis-Jordan, Wei Liu, linux-cxl,
	Brian Cain, Pierrick Bouvier, Philippe Mathieu-Daudé,
	Peter Xu, Fabiano Rosas, Haotian Jiang

Hi

On Mon, Jul 27, 2026 at 3:07 PM Daniel P. Berrangé <berrange@redhat.com> wrote:
>
> On Sun, Jul 26, 2026 at 12:24:52PM +0400, Marc-André Lureau wrote:
> > Hi
> >
> > On Sun, Jul 26, 2026 at 11:33 AM Akihiko Odaki
> > <odaki@rsg.ci.i.u-tokyo.ac.jp> wrote:
> > >
> > > On 2026/07/25 23:00, Marc-André Lureau wrote:
> > > > rutabaga_cmd_get_capset_info() only fills in capset_id,
> > > > capset_max_version and capset_max_size before sending the response to
> > > > the guest. The remaining fields of struct virtio_gpu_resp_capset_info,
> > > > including hdr.fence_id, hdr.ctx_id and hdr.ring_idx, are left with
> > > > stack garbage and leaked to the guest, including host pointers useful
> > > > for an ASLR bypass.
> > > >
> > > > Zero the response first, matching virgl_cmd_get_capset_info().
> > > >
> > > > Not a real risk thanks to -ftrivial-auto-var-init=zero.
> > >
> > > GCC only added -ftrivial-auto-var-init=zero in GCC 12, while QEMU still
> > > supports GCC 10.4/11.
>
> Opps, I thought we had new enough versions already.
>
> >
> > Good point, may be we should update:
> > https://patchew.org/QEMU/20260723094622.1515831-1-berrange@redhat.com/
>
> I'm inclined to bump our min GCC/Clang versions so we can assume
> zero-init.
>
> We picked 10.5 due to NetBSD, and CentOS 9 still has 11.x
>
> In both those cases, however, Clang is available in new enough
> version to support -ftrivial-auto-var-init=zero. In NetBSD
> there are also many new versions of GCC  available, only the
> base system GCC is 10.5.

Apparently it needs clang 16 from Mar 2023
(https://releases.llvm.org/18.1.6/tools/clang/docs/ReleaseNotes.html#removed-compiler-flags)

>
>
> With regards,
> Daniel
> --
> |: https://berrange.com       ~~        https://hachyderm.io/@berrange :|
> |: https://libvirt.org          ~~          https://entangle-photo.org :|
> |: https://pixelfed.art/berrange   ~~    https://fstop138.berrange.com :|
>
>

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 4/7] hw/hexagon: fix machine->fdt leak in qom-test
  2026-07-25 14:00 ` [PATCH 4/7] hw/hexagon: fix machine->fdt leak in qom-test Marc-André Lureau
  2026-07-27  6:41   ` Philippe Mathieu-Daudé
@ 2026-07-27 15:14   ` Brian Cain
  1 sibling, 0 replies; 19+ messages in thread
From: Brian Cain @ 2026-07-27 15:14 UTC (permalink / raw)
  To: Marc-André Lureau, qemu-devel
  Cc: Michael S. Tsirkin, Alex Bennée, Akihiko Odaki,
	Dmitry Osipenko, Stefan Hajnoczi, Kevin Wolf, Hanna Reitz,
	qemu-block, Jonathan Cameron, Paolo Bonzini, Fam Zheng,
	Daniel P. Berrangé, Zhao Liu, Roman Bolshakov,
	Phil Dennis-Jordan, Wei Liu, linux-cxl, Pierrick Bouvier,
	Philippe Mathieu-Daudé, Peter Xu, Fabiano Rosas


On 7/25/2026 9:00 AM, Marc-André Lureau wrote:
> virt_instance_init() built the FDT unconditionally at QOM
> instance-init time, so simply instantiating the object (e.g. via
> qom-test's introspection, without ever realizing the machine) leaked
> the 1MB FDT blob: machine_finalize() does not free machine->fdt.
>
> Other boards (arm/virt, riscv/virt, ...) build the FDT lazily from
> their MachineClass::init callback, which only runs when the machine
> is actually selected to boot. Do the same here by moving create_fdt()
> into virt_init().
>
> Fixes: 88a8bc7f43ff ("hw/hexagon: Define hexagon "virt" machine")
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---

Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>


>   hw/hexagon/virt.c | 9 +--------
>   1 file changed, 1 insertion(+), 8 deletions(-)
>
> diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c
> index a3638998b873..b75047250260 100644
> --- a/hw/hexagon/virt.c
> +++ b/hw/hexagon/virt.c
> @@ -175,13 +175,6 @@ static void fdt_add_cpu_nodes(const HexagonVirtMachineState *vms)
>   
>   
>   
> -static void virt_instance_init(Object *obj)
> -{
> -    HexagonVirtMachineState *vms = HEXAGON_VIRT_MACHINE(obj);
> -
> -    create_fdt(vms);
> -}
> -
>   void hexagon_load_fdt(const HexagonVirtMachineState *vms)
>   {
>       MachineState *ms = MACHINE(vms);
> @@ -242,6 +235,7 @@ static void virt_init(MachineState *ms)
>       DeviceState *cpu0;
>       int32_t clk_phandle;
>   
> +    create_fdt(vms);
>       qemu_fdt_setprop_string(ms->fdt, "/chosen", "bootargs", ms->kernel_cmdline);
>   
>       vms->sys = get_system_memory();
> @@ -341,7 +335,6 @@ static const TypeInfo virt_machine_types[] = { {
>       .parent = TYPE_HEXAGON_COMMON_MACHINE,
>       .instance_size = sizeof(HexagonVirtMachineState),
>       .class_init = virt_class_init,
> -    .instance_init = virt_instance_init,
>   } };
>   
>   DEFINE_TYPES(virt_machine_types)
>

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2026-07-27 15:14 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-25 14:00 [PATCH 0/7] Fixes for 11.1 Marc-André Lureau
2026-07-25 14:00 ` [PATCH 1/7] hw/display/virtio-gpu-rutabaga: zero-init capset info response Marc-André Lureau
2026-07-26  7:32   ` Akihiko Odaki
2026-07-26  8:24     ` Marc-André Lureau
2026-07-26  8:33       ` Akihiko Odaki
2026-07-27 11:05       ` Daniel P. Berrangé
2026-07-27 11:20         ` Marc-André Lureau
2026-07-25 14:00 ` [PATCH 2/7] block/blkio: fix error return value on getlength() Marc-André Lureau
2026-07-26  7:36   ` Akihiko Odaki
2026-07-25 14:00 ` [PATCH 3/7] Fix many -Werror=maybe-uninitialized Marc-André Lureau
2026-07-26  8:29   ` Akihiko Odaki
2026-07-25 14:00 ` [PATCH 4/7] hw/hexagon: fix machine->fdt leak in qom-test Marc-André Lureau
2026-07-27  6:41   ` Philippe Mathieu-Daudé
2026-07-27 15:14   ` Brian Cain
2026-07-25 14:00 ` [PATCH 5/7] hw/core/machine: free machine->fdt in machine_finalize() Marc-André Lureau
2026-07-26  8:54   ` Akihiko Odaki
2026-07-25 14:00 ` [PATCH 6/7] migration/multifd: fix Error leak in multifd_recv_terminate_threads() Marc-André Lureau
2026-07-25 14:00 ` [PATCH 7/7] qdev-monitor: drain RCU callbacks in qdev_device_add_from_qdict Marc-André Lureau
2026-07-26  7:31   ` Akihiko Odaki

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.