@samitouri / QOSamiQemu / commits / 92c754bcbd

io/net-listener: move mutex init to instance_init

The QIONetListener mutex is initialized in the convenience constructor qio_net_listener_new() rather than in an instance_init. This means a bare object_new(TYPE_QIO_NET_LISTENER) produces an object with an uninitialized mutex, but instance_finalize unconditionally calls qemu_mutex_destroy() on it, which aborts. Move the mutex initialization to a proper instance_init so that init and finalize are always paired regardless of how the object is created. Fixes: 9d86181874a ("qio: Protect NetListener callback with mutex") Cc: peterx@redhat.com Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Peter Xu <peterx@redhat.com> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Marc-André Lureau committed Apr 25, 2026 at 01:00 UTC 92c754bcbdbc1321861067af1fd02e00fb2b092b
1 file changed +8 -1
io/net-listener.c
+8 -1
@@ -38,7 +38,6 @@ QIONetListener *qio_net_listener_new(void)
38 QIONetListener *listener;
39
40 listener = QIO_NET_LISTENER(object_new(TYPE_QIO_NET_LISTENER));
41 - qemu_mutex_init(&listener->lock);
41 return listener;
42 }
43
@@ -440,6 +439,13 @@ qio_net_listener_get_local_address(QIONetListener *listener, size_t n,
439 return qio_channel_socket_get_local_address(sioc, errp);
440 }
441
442 +static void qio_net_listener_instance_init(Object *obj)
443 +{
444 + QIONetListener *listener = QIO_NET_LISTENER(obj);
445 +
446 + qemu_mutex_init(&listener->lock);
447 +}
448 +
449 static void qio_net_listener_finalize(Object *obj)
450 {
451 QIONetListener *listener = QIO_NET_LISTENER(obj);
@@ -463,6 +469,7 @@ static const TypeInfo qio_net_listener_info = {
469 .parent = TYPE_OBJECT,
470 .name = TYPE_QIO_NET_LISTENER,
471 .instance_size = sizeof(QIONetListener),
472 + .instance_init = qio_net_listener_instance_init,
473 .instance_finalize = qio_net_listener_finalize,
474 };
475