Skip to content

Commit 3b031ed

Browse files
etherealjoywing328
authored andcommitted
[qt5cpp] delete callback data allocated before signal emission (#7840)
* Small fixes to prevent crash when empty json body is provided. * Add deleteLater wrapper for pointers passed to user code to prevent memory leak. * Updates to move Object Wrapper to separate file * Add Prefix to class name
1 parent d185009 commit 3b031ed

File tree

10 files changed

+109
-17
lines changed

10 files changed

+109
-17
lines changed

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public Qt5CPPGenerator() {
117117
supportingFiles.add(new SupportingFile("HttpRequest.cpp.mustache", sourceFolder, PREFIX + "HttpRequest.cpp"));
118118
supportingFiles.add(new SupportingFile("modelFactory.mustache", sourceFolder, PREFIX + "ModelFactory.h"));
119119
supportingFiles.add(new SupportingFile("object.mustache", sourceFolder, PREFIX + "Object.h"));
120+
supportingFiles.add(new SupportingFile("QObjectWrapper.h.mustache", sourceFolder, PREFIX + "QObjectWrapper.h"));
120121
if (optionalProjectFileFlag) {
121122
supportingFiles.add(new SupportingFile("Project.mustache", sourceFolder, "client.pri"));
122123
}
@@ -176,6 +177,7 @@ public void processOpts() {
176177
supportingFiles.add(new SupportingFile("HttpRequest.cpp.mustache", sourceFolder, modelNamePrefix + "HttpRequest.cpp"));
177178
supportingFiles.add(new SupportingFile("modelFactory.mustache", sourceFolder, modelNamePrefix + "ModelFactory.h"));
178179
supportingFiles.add(new SupportingFile("object.mustache", sourceFolder, modelNamePrefix + "Object.h"));
180+
supportingFiles.add(new SupportingFile("QObjectWrapper.h.mustache", sourceFolder, modelNamePrefix + "QObjectWrapper.h"));
179181

180182
typeMapping.put("object", modelNamePrefix + "Object");
181183
typeMapping.put("file", modelNamePrefix + "HttpRequestInputFileElement");

modules/swagger-codegen/src/main/resources/qt5cpp/Project.mustache

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ HEADERS += \
1919
$${PWD}/{{prefix}}Helpers.h \
2020
$${PWD}/{{prefix}}HttpRequest.h \
2121
$${PWD}/{{prefix}}ModelFactory.h \
22-
$${PWD}/{{prefix}}Object.h
22+
$${PWD}/{{prefix}}Object.h \
23+
$${PWD}/{{prefix}}QObjectWrapper.h
2324

2425
SOURCES += \
2526
# Models
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{{>licenseInfo}}
2+
#ifndef {{prefix}}_QOBJECT_WRAPPER_H
3+
#define {{prefix}}_QOBJECT_WRAPPER_H
4+
5+
#include <QObject>
6+
7+
{{#cppNamespaceDeclarations}}
8+
namespace {{this}} {
9+
{{/cppNamespaceDeclarations}}
10+
11+
template <typename ObjectPtrT>
12+
class {{prefix}}QObjectWrapper : public QObject {
13+
public:
14+
{{prefix}}QObjectWrapper(ObjectPtrT ptr){
15+
data = ptr;
16+
}
17+
~{{prefix}}QObjectWrapper(){
18+
delete data;
19+
}
20+
private :
21+
ObjectPtrT data;
22+
};
23+
24+
{{#cppNamespaceDeclarations}}
25+
}
26+
{{/cppNamespaceDeclarations}}
27+
28+
#endif // {{prefix}}_QOBJECT_WRAPPER_H

modules/swagger-codegen/src/main/resources/qt5cpp/api-body.mustache

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "{{classname}}.h"
33
#include "{{prefix}}Helpers.h"
44
#include "{{prefix}}ModelFactory.h"
5+
#include "{{prefix}}QObjectWrapper.h"
56

67
#include <QJsonArray>
78
#include <QJsonDocument>
@@ -150,20 +151,30 @@ void
150151
QByteArray array (json.toStdString().c_str());
151152
QJsonDocument doc = QJsonDocument::fromJson(array);
152153
QJsonArray jsonArray = doc.array();
153-
154+
auto wrapper = new {{prefix}}QObjectWrapper<{{{returnType}}}> (output);
155+
wrapper->deleteLater();
154156
foreach(QJsonValue obj, jsonArray) {
155157
{{{returnBaseType}}}* o = new {{returnBaseType}}();
156158
QJsonObject jv = obj.toObject();
157159
QJsonObject * ptr = (QJsonObject*)&jv;
158160
o->fromJsonObject(*ptr);
161+
auto objwrapper = new {{prefix}}QObjectWrapper<{{{returnBaseType}}}*> (o);
162+
objwrapper->deleteLater();
159163
output->append(o);
160164
}
161165
{{/isListContainer}}
162-
163166
{{^isListContainer}}
164167
{{^isMapContainer}}
165168
{{#returnTypeIsPrimitive}}
166169
{{{returnType}}} output; // TODO add primitive output support
170+
{{#isByteArray}}auto wrapper = new {{prefix}}QObjectWrapper<{{{returnType}}}> (output);
171+
wrapper->deleteLater();{{/isByteArray}}
172+
{{#isDateTime}}auto wrapper = new {{prefix}}QObjectWrapper<{{{returnType}}}> (output);
173+
wrapper->deleteLater();{{/isDateTime}}
174+
{{#isDate}}auto wrapper = new {{prefix}}QObjectWrapper<{{{returnType}}}> (output);
175+
wrapper->deleteLater();{{/isDate}}
176+
{{#isString}}auto wrapper = new {{prefix}}QObjectWrapper<{{{returnType}}}> (output);
177+
wrapper->deleteLater();{{/isString}}
167178
{{/returnTypeIsPrimitive}}
168179
{{/isMapContainer}}
169180
{{#isMapContainer}}
@@ -183,6 +194,8 @@ void
183194
{{^returnTypeIsPrimitive}}
184195
QString json(worker->response);
185196
{{{returnType}}} output = static_cast<{{{returnType}}}>(create(json, QString("{{{returnBaseType}}}")));
197+
auto wrapper = new {{prefix}}QObjectWrapper<{{{returnType}}}> (output);
198+
wrapper->deleteLater();
186199
{{/returnTypeIsPrimitive}}
187200
{{/isMapContainer}}
188201
{{/isListContainer}}

samples/client/petstore/qt5cpp/PetStore/PetApiTests.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ void PetApiTests::updatePetWithFormTest() {
185185
static SWGPetApi* api = getApi();
186186

187187
SWGPet* pet = createRandomPet();
188-
static SWGPet* petToCheck;
188+
SWGPet* petToCheck;
189189
qint64 id = pet->getId();
190190
static QEventLoop loop;
191191
QTimer timer;
@@ -209,7 +209,7 @@ void PetApiTests::updatePetWithFormTest() {
209209
timer.setInterval(1000);
210210
timer.setSingleShot(true);
211211

212-
auto fetchPet = [](SWGPet* pet) {
212+
auto fetchPet = [&](SWGPet* pet) {
213213
petToCheck = pet;
214214
loop.quit();
215215
};

samples/client/petstore/qt5cpp/client/SWGPetApi.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "SWGPetApi.h"
1414
#include "SWGHelpers.h"
1515
#include "SWGModelFactory.h"
16+
#include "SWGQObjectWrapper.h"
1617

1718
#include <QJsonArray>
1819
#include <QJsonDocument>
@@ -220,15 +221,17 @@ SWGPetApi::findPetsByStatusCallback(SWGHttpRequestWorker * worker) {
220221
QByteArray array (json.toStdString().c_str());
221222
QJsonDocument doc = QJsonDocument::fromJson(array);
222223
QJsonArray jsonArray = doc.array();
223-
224+
auto wrapper = new SWGQObjectWrapper<QList<SWGPet*>*> (output);
225+
wrapper->deleteLater();
224226
foreach(QJsonValue obj, jsonArray) {
225227
SWGPet* o = new SWGPet();
226228
QJsonObject jv = obj.toObject();
227229
QJsonObject * ptr = (QJsonObject*)&jv;
228230
o->fromJsonObject(*ptr);
231+
auto objwrapper = new SWGQObjectWrapper<SWGPet*> (o);
232+
objwrapper->deleteLater();
229233
output->append(o);
230234
}
231-
232235
worker->deleteLater();
233236

234237
if (worker->error_type == QNetworkReply::NoError) {
@@ -325,15 +328,17 @@ SWGPetApi::findPetsByTagsCallback(SWGHttpRequestWorker * worker) {
325328
QByteArray array (json.toStdString().c_str());
326329
QJsonDocument doc = QJsonDocument::fromJson(array);
327330
QJsonArray jsonArray = doc.array();
328-
331+
auto wrapper = new SWGQObjectWrapper<QList<SWGPet*>*> (output);
332+
wrapper->deleteLater();
329333
foreach(QJsonValue obj, jsonArray) {
330334
SWGPet* o = new SWGPet();
331335
QJsonObject jv = obj.toObject();
332336
QJsonObject * ptr = (QJsonObject*)&jv;
333337
o->fromJsonObject(*ptr);
338+
auto objwrapper = new SWGQObjectWrapper<SWGPet*> (o);
339+
objwrapper->deleteLater();
334340
output->append(o);
335341
}
336-
337342
worker->deleteLater();
338343

339344
if (worker->error_type == QNetworkReply::NoError) {
@@ -385,9 +390,10 @@ SWGPetApi::getPetByIdCallback(SWGHttpRequestWorker * worker) {
385390
msg = "Error: " + worker->error_str;
386391
}
387392

388-
389393
QString json(worker->response);
390394
SWGPet* output = static_cast<SWGPet*>(create(json, QString("SWGPet")));
395+
auto wrapper = new SWGQObjectWrapper<SWGPet*> (output);
396+
wrapper->deleteLater();
391397
worker->deleteLater();
392398

393399
if (worker->error_type == QNetworkReply::NoError) {
@@ -554,9 +560,10 @@ SWGPetApi::uploadFileCallback(SWGHttpRequestWorker * worker) {
554560
msg = "Error: " + worker->error_str;
555561
}
556562

557-
558563
QString json(worker->response);
559564
SWGApiResponse* output = static_cast<SWGApiResponse*>(create(json, QString("SWGApiResponse")));
565+
auto wrapper = new SWGQObjectWrapper<SWGApiResponse*> (output);
566+
wrapper->deleteLater();
560567
worker->deleteLater();
561568

562569
if (worker->error_type == QNetworkReply::NoError) {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* Swagger Petstore
3+
* This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.
4+
*
5+
* OpenAPI spec version: 1.0.0
6+
* Contact: [email protected]
7+
*
8+
* NOTE: This class is auto generated by the swagger code generator program.
9+
* https://github.com/swagger-api/swagger-codegen.git
10+
* Do not edit the class manually.
11+
*/
12+
13+
#ifndef SWG_QOBJECT_WRAPPER_H
14+
#define SWG_QOBJECT_WRAPPER_H
15+
16+
#include <QObject>
17+
18+
namespace Swagger {
19+
20+
template <typename ObjectPtrT>
21+
class SWGQObjectWrapper : public QObject {
22+
public:
23+
SWGQObjectWrapper(ObjectPtrT ptr){
24+
data = ptr;
25+
}
26+
~SWGQObjectWrapper(){
27+
delete data;
28+
}
29+
private :
30+
ObjectPtrT data;
31+
};
32+
33+
}
34+
35+
#endif // SWG_QOBJECT_WRAPPER_H

samples/client/petstore/qt5cpp/client/SWGStoreApi.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "SWGStoreApi.h"
1414
#include "SWGHelpers.h"
1515
#include "SWGModelFactory.h"
16+
#include "SWGQObjectWrapper.h"
1617

1718
#include <QJsonArray>
1819
#include <QJsonDocument>
@@ -118,7 +119,6 @@ SWGStoreApi::getInventoryCallback(SWGHttpRequestWorker * worker) {
118119
msg = "Error: " + worker->error_str;
119120
}
120121

121-
122122
QMap<QString, qint32>* output = new QMap<QString, qint32>();
123123
QString json(worker->response);
124124
QByteArray array (json.toStdString().c_str());
@@ -181,9 +181,10 @@ SWGStoreApi::getOrderByIdCallback(SWGHttpRequestWorker * worker) {
181181
msg = "Error: " + worker->error_str;
182182
}
183183

184-
185184
QString json(worker->response);
186185
SWGOrder* output = static_cast<SWGOrder*>(create(json, QString("SWGOrder")));
186+
auto wrapper = new SWGQObjectWrapper<SWGOrder*> (output);
187+
wrapper->deleteLater();
187188
worker->deleteLater();
188189

189190
if (worker->error_type == QNetworkReply::NoError) {
@@ -236,9 +237,10 @@ SWGStoreApi::placeOrderCallback(SWGHttpRequestWorker * worker) {
236237
msg = "Error: " + worker->error_str;
237238
}
238239

239-
240240
QString json(worker->response);
241241
SWGOrder* output = static_cast<SWGOrder*>(create(json, QString("SWGOrder")));
242+
auto wrapper = new SWGQObjectWrapper<SWGOrder*> (output);
243+
wrapper->deleteLater();
242244
worker->deleteLater();
243245

244246
if (worker->error_type == QNetworkReply::NoError) {

samples/client/petstore/qt5cpp/client/SWGUserApi.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "SWGUserApi.h"
1414
#include "SWGHelpers.h"
1515
#include "SWGModelFactory.h"
16+
#include "SWGQObjectWrapper.h"
1617

1718
#include <QJsonArray>
1819
#include <QJsonDocument>
@@ -284,9 +285,10 @@ SWGUserApi::getUserByNameCallback(SWGHttpRequestWorker * worker) {
284285
msg = "Error: " + worker->error_str;
285286
}
286287

287-
288288
QString json(worker->response);
289289
SWGUser* output = static_cast<SWGUser*>(create(json, QString("SWGUser")));
290+
auto wrapper = new SWGQObjectWrapper<SWGUser*> (output);
291+
wrapper->deleteLater();
290292
worker->deleteLater();
291293

292294
if (worker->error_type == QNetworkReply::NoError) {
@@ -352,9 +354,10 @@ SWGUserApi::loginUserCallback(SWGHttpRequestWorker * worker) {
352354
msg = "Error: " + worker->error_str;
353355
}
354356

355-
356357
QString json(worker->response);
357358
QString* output = static_cast<QString*>(create(json, QString("QString")));
359+
auto wrapper = new SWGQObjectWrapper<QString*> (output);
360+
wrapper->deleteLater();
358361
worker->deleteLater();
359362

360363
if (worker->error_type == QNetworkReply::NoError) {

samples/client/petstore/qt5cpp/client/client.pri

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ HEADERS += \
1616
$${PWD}/SWGHelpers.h \
1717
$${PWD}/SWGHttpRequest.h \
1818
$${PWD}/SWGModelFactory.h \
19-
$${PWD}/SWGObject.h
19+
$${PWD}/SWGObject.h \
20+
$${PWD}/SWGQObjectWrapper.h
2021

2122
SOURCES += \
2223
# Models

0 commit comments

Comments
 (0)