Properly handle QGenericReturnArgument
authorManuel Nickschas <sputnick@quassel-irc.org>
Tue, 27 Mar 2012 20:04:03 +0000 (22:04 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sun, 1 Apr 2012 21:07:53 +0000 (23:07 +0200)
Using the memory address of the QVariant that acts as buffer is bad. While we got
lucky with Qt4, and this worked by accident, it leads to subtle and not-so-subtle segfaults
when used with Qt5.

Instead, using QVariant::data() makes sure that implicitly shared data is properly detached.

src/common/syncableobject.cpp

index 8667a59..ac62f08 100644 (file)
@@ -105,15 +105,14 @@ QVariantMap SyncableObject::toVariantMap() {
       qWarning() << "SyncableObject::toVariantMap(): cannot fetch init data for:" << this << method.signature() << "- Returntype is unknown to Qt's MetaSystem:" << QByteArray(method.typeName());
       continue;
     }
-    QVariant value = QVariant(variantType);
-    QGenericReturnArgument genericvalue = QGenericReturnArgument(method.typeName(), &value);
+
+    QVariant value(variantType, (const void *) 0);
+    QGenericReturnArgument genericvalue = QGenericReturnArgument(method.typeName(), value.data());
     QMetaObject::invokeMethod(this, methodname.toAscii(), genericvalue);
 
     properties[SignalProxy::ExtendedMetaObject::methodBaseName(method)] = value;
   }
-  // properties["Payload"] = QByteArray(10000000, 'a');  // for testing purposes
   return properties;
-
 }
 
 void SyncableObject::fromVariantMap(const QVariantMap &properties) {