From 3bc179c30d761f2ece11593218587954b763cf88 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 15 Jan 2024 15:34:06 +0100 Subject: [PATCH] QMetaType: Assert on consistency when unregistering If we are trying to unregister a metatype with an ID that belongs to a different metatype, then something is very wrong. Change-Id: I3191557883b69030f91c3aca7f359acf2dde66e7 Reviewed-by: Fabian Kosmale Reviewed-by: Thiago Macieira --- src/corelib/kernel/qmetatype.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index 15a926fd465..a008485d8a2 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -907,13 +907,22 @@ bool QMetaType::isOrdered() const */ void QMetaType::unregisterMetaType(QMetaType type) { - if (type.d_ptr && type.d_ptr->typeId.loadRelaxed() >= QMetaType::User) { - // this is a custom meta type (not read-only) - auto d = const_cast(type.d_ptr); - if (auto reg = customTypeRegistry()) - reg->unregisterDynamicType(d->typeId.loadRelaxed()); - d->typeId.storeRelease(0); + const QtPrivate::QMetaTypeInterface *d_ptr = type.d_ptr; + if (!d_ptr) + return; + + const int typeId = d_ptr->typeId.loadRelaxed(); + if (typeId < QMetaType::User) + return; + + // this is a custom meta type (not read-only) + + if (auto reg = customTypeRegistry()) { + Q_ASSERT(reg->getCustomType(typeId) == d_ptr); + reg->unregisterDynamicType(typeId); } + + const_cast(d_ptr)->typeId.storeRelease(0); } /*!