From 4b4528317c96fe4575503bd18edafe7a6fd2392a Mon Sep 17 00:00:00 2001 From: etherealjoy <33183834+etherealjoy@users.noreply.github.com> Date: Thu, 14 Dec 2017 17:38:42 +0100 Subject: [PATCH] Fixes segmentation faults for arrays of primitive types (#7099) [C++][Qt5] Fixes segmentation faults for arrays of primitive types --- .../codegen/languages/Qt5CPPGenerator.java | 16 +- .../resources/qt5cpp/helpers-body.mustache | 200 +++++++++++++----- 2 files changed, 150 insertions(+), 66 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java index 2637409f2fe..774184ef26c 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java @@ -315,19 +315,13 @@ public class Qt5CPPGenerator extends AbstractCppCodegen implements CodegenConfig } else if (p instanceof DecimalProperty) { return "0.0"; } else if (p instanceof MapProperty) { - MapProperty ap = (MapProperty) p; - String inner = getSwaggerType(ap.getAdditionalProperties()); - if (!languageSpecificPrimitives.contains(inner)) { - inner += "*"; - } - return "new QMap()"; + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + return "new QMap()"; } else if (p instanceof ArrayProperty) { ArrayProperty ap = (ArrayProperty) p; - String inner = getSwaggerType(ap.getItems()); - if (!languageSpecificPrimitives.contains(inner)) { - inner += "*"; - } - return "new QList<" + inner + ">()"; + Property inner = ap.getItems(); + return "new QList<" + getTypeDeclaration(inner) + ">()"; } // else if (p instanceof RefProperty) { diff --git a/modules/swagger-codegen/src/main/resources/qt5cpp/helpers-body.mustache b/modules/swagger-codegen/src/main/resources/qt5cpp/helpers-body.mustache index e0f2f09a309..94d1d60a37c 100644 --- a/modules/swagger-codegen/src/main/resources/qt5cpp/helpers-body.mustache +++ b/modules/swagger-codegen/src/main/resources/qt5cpp/helpers-body.mustache @@ -132,10 +132,10 @@ setValue(void* value, QJsonValue obj, QString type, QString complexType) { } else if(type.startsWith("QList") && QString("").compare(complexType) != 0 && obj.isArray()) { // list of values - QList* output = new QList(); - QJsonArray arr = obj.toArray(); - foreach (const QJsonValue & jval, arr) { - if(complexType.startsWith("SWG")) { + if(complexType.startsWith("SWG")) { + QList* output = new QList(); + QJsonArray arr = obj.toArray(); + for (const QJsonValue & jval : arr) { // it's an object SWGObject * val = (SWGObject*)create(complexType); QJsonObject t = jval.toObject(); @@ -143,53 +143,102 @@ setValue(void* value, QJsonValue obj, QString type, QString complexType) { val->fromJsonObject(t); output->append(val); } - else { - // primitives - if(QStringLiteral("qint32").compare(complexType) == 0) { - qint32 val; - setValue(&val, jval, QStringLiteral("qint32"), QStringLiteral("")); - output->append((void*)&val); - } - else if(QStringLiteral("qint64").compare(complexType) == 0) { - qint64 val; - setValue(&val, jval, QStringLiteral("qint64"), QStringLiteral("")); - output->append((void*)&val); - } - else if(QStringLiteral("bool").compare(complexType) == 0) { - bool val; - setValue(&val, jval, QStringLiteral("bool"), QStringLiteral("")); - output->append((void*)&val); - } - else if(QStringLiteral("float").compare(complexType) == 0) { - float val; - setValue(&val, jval, QStringLiteral("float"), QStringLiteral("")); - output->append((void*)&val); - } - else if(QStringLiteral("double").compare(complexType) == 0) { - double val; - setValue(&val, jval, QStringLiteral("double"), QStringLiteral("")); - output->append((void*)&val); - } - else if(QStringLiteral("QString").compare(complexType) == 0) { - QString * val = new QString(); - setValue(&val, jval, QStringLiteral("QString"), QStringLiteral("")); - output->append((void*)val); - } - else if(QStringLiteral("QDate").compare(complexType) == 0) { - QDate * val = new QDate(); - setValue(&val, jval, QStringLiteral("QDate"), QStringLiteral("")); - output->append((void*)val); - } - else if(QStringLiteral("QDateTime").compare(complexType) == 0) { - QDateTime * val = new QDateTime(); - setValue(&val, jval, QStringLiteral("QDateTime"), QStringLiteral("")); - output->append((void*)val); - } + QList **val = static_cast**>(value); + for (auto item : **val) { + delete item; + } + delete *val; + *val = output; + } + else if(QStringLiteral("qint32").compare(complexType) == 0) { + QList **output = reinterpret_cast **> (value); + (*output)->clear(); + QJsonArray arr = obj.toArray(); + for (const QJsonValue & jval : arr){ + qint32 val; + setValue(&val, jval, QStringLiteral("qint32"), QStringLiteral("")); + (*output)->push_back(val); + } + } + else if(QStringLiteral("qint64").compare(complexType) == 0) { + QList **output = reinterpret_cast **> (value); + (*output)->clear(); + QJsonArray arr = obj.toArray(); + for (const QJsonValue & jval : arr){ + qint64 val; + setValue(&val, jval, QStringLiteral("qint64"), QStringLiteral("")); + (*output)->push_back(val); + } + } + else if(QStringLiteral("bool").compare(complexType) == 0) { + QList **output = reinterpret_cast **> (value); + (*output)->clear(); + QJsonArray arr = obj.toArray(); + for (const QJsonValue & jval : arr){ + bool val; + setValue(&val, jval, QStringLiteral("bool"), QStringLiteral("")); + (*output)->push_back(val); + } + } + else if(QStringLiteral("float").compare(complexType) == 0) { + QList **output = reinterpret_cast **> (value); + (*output)->clear(); + QJsonArray arr = obj.toArray(); + for (const QJsonValue & jval : arr){ + float val; + setValue(&val, jval, QStringLiteral("float"), QStringLiteral("")); + (*output)->push_back(val); + } + } + else if(QStringLiteral("double").compare(complexType) == 0) { + QList **output = reinterpret_cast **> (value); + (*output)->clear(); + QJsonArray arr = obj.toArray(); + for (const QJsonValue & jval : arr){ + double val; + setValue(&val, jval, QStringLiteral("double"), QStringLiteral("")); + (*output)->push_back(val); + } + } + else if(QStringLiteral("QString").compare(complexType) == 0) { + QList **output = reinterpret_cast **> (value); + for (auto item : **output) { + delete item; + } + (*output)->clear(); + QJsonArray arr = obj.toArray(); + for (const QJsonValue & jval : arr){ + QString * val = new QString(); + setValue(&val, jval, QStringLiteral("QString"), QStringLiteral("")); + (*output)->push_back(val); + } + } + else if(QStringLiteral("QDate").compare(complexType) == 0) { + QList **output = reinterpret_cast **> (value); + for (auto item : **output) { + delete item; + } + (*output)->clear(); + QJsonArray arr = obj.toArray(); + for (const QJsonValue & jval : arr){ + QDate * val = new QDate(); + setValue(&val, jval, QStringLiteral("QDate"), QStringLiteral("")); + (*output)->push_back(val); + } + } + else if(QStringLiteral("QDateTime").compare(complexType) == 0) { + QList **output = reinterpret_cast **> (value); + for (auto item : **output) { + delete item; + } + (*output)->clear(); + QJsonArray arr = obj.toArray(); + for (const QJsonValue & jval : arr){ + QDateTime * val = new QDateTime(); + setValue(&val, jval, QStringLiteral("QDateTime"), QStringLiteral("")); + (*output)->push_back(val); } } - QList **val = static_cast**>(value); - delete *val; - *val = output; } } @@ -208,7 +257,7 @@ toJsonValue(QString name, void* value, QJsonObject* output, QString type) { } else { output->empty(); - foreach(QString key, o->keys()) { + for(QString key : o->keys()) { output->insert(key, o->value(key)); } } @@ -254,11 +303,52 @@ toJsonValue(QString name, void* value, QJsonObject* output, QString type) { void toJsonArray(QList* value, QJsonArray* output, QString innerName, QString innerType) { - foreach(void* obj, *value) { - QJsonObject element; - - toJsonValue(nullptr, obj, &element, innerType); - output->append(element); + if(innerType.startsWith("SWG")){ + for(void* obj : *value) { + SWGObject *swgObject = reinterpret_cast(obj); + if(swgObject != nullptr) { + output->append(*(swgObject->asJsonObject())); + } + } + } + else if(QStringLiteral("QString").compare(innerType) == 0) { + for(QString* obj : *(reinterpret_cast*>(value))){ + output->append(QJsonValue(*obj)); + } + } + else if(QStringLiteral("QDate").compare(innerType) == 0) { + for(QDate* obj : *(reinterpret_cast*>(value))){ + output->append(QJsonValue(obj->toString(Qt::ISODate))); + } + } + else if(QStringLiteral("QDateTime").compare(innerType) == 0) { + for(QDateTime* obj : *(reinterpret_cast*>(value))){ + output->append(QJsonValue(obj->toString(Qt::ISODate))); } + } + else if(QStringLiteral("QByteArray").compare(innerType) == 0) { + for(QByteArray* obj : *(reinterpret_cast*>(value))){ + output->append(QJsonValue(QString(obj->toBase64()))); + } + } + else if(QStringLiteral("qint32").compare(innerType) == 0) { + for(qint32 obj : *(reinterpret_cast*>(value))) + output->append(QJsonValue(obj)); + } + else if(QStringLiteral("qint64").compare(innerType) == 0) { + for(qint64 obj : *(reinterpret_cast*>(value))) + output->append(QJsonValue(obj)); + } + else if(QStringLiteral("bool").compare(innerType) == 0) { + for(bool obj : *(reinterpret_cast*>(value))) + output->append(QJsonValue(obj)); + } + else if(QStringLiteral("float").compare(innerType) == 0) { + for(float obj : *(reinterpret_cast*>(value))) + output->append(QJsonValue(obj)); + } + else if(QStringLiteral("double").compare(innerType) == 0) { + for(double obj : *(reinterpret_cast*>(value))) + output->append(QJsonValue(obj)); } }