Skip to content

Commit f0c4fd7

Browse files
authored
[C][Client] Fix coredump when releasing the memory of an incompleted resource (#8190)
1 parent 180fae0 commit f0c4fd7

7 files changed

Lines changed: 117 additions & 39 deletions

File tree

modules/openapi-generator/src/main/resources/C-libcurl/model-body.mustache

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -214,59 +214,92 @@ void {{classname}}_free({{classname}}_t *{{classname}}) {
214214
{{^isPrimitiveType}}
215215
{{#isModel}}
216216
{{^isEnum}}
217-
{{{complexType}}}_free({{{classname}}}->{{{name}}});
217+
if ({{{classname}}}->{{{name}}}) {
218+
{{{complexType}}}_free({{{classname}}}->{{{name}}});
219+
{{classname}}->{{name}} = NULL;
220+
}
218221
{{/isEnum}}
219222
{{/isModel}}
220223
{{#isUuid}}
221-
free({{{classname}}}->{{{name}}});
224+
if ({{{classname}}}->{{{name}}}) {
225+
free({{{classname}}}->{{{name}}});
226+
{{classname}}->{{name}} = NULL;
227+
}
222228
{{/isUuid}}
223229
{{#isEmail}}
224-
free({{{classname}}}->{{{name}}});
230+
if ({{{classname}}}->{{{name}}}) {
231+
free({{{classname}}}->{{{name}}});
232+
{{classname}}->{{name}} = NULL;
233+
}
225234
{{/isEmail}}
226235
{{#isFreeFormObject}}
227-
object_free({{{classname}}}->{{{name}}});
236+
if ({{{classname}}}->{{{name}}}) {
237+
object_free({{{classname}}}->{{{name}}});
238+
{{classname}}->{{name}} = NULL;
239+
}
228240
{{/isFreeFormObject}}
229241
{{/isPrimitiveType}}
230242
{{#isPrimitiveType}}
231243
{{^isEnum}}
232244
{{#isString}}
233-
free({{{classname}}}->{{{name}}});
245+
if ({{{classname}}}->{{{name}}}) {
246+
free({{{classname}}}->{{{name}}});
247+
{{classname}}->{{name}} = NULL;
248+
}
234249
{{/isString}}
235250
{{/isEnum}}
236251
{{#isBinary}}
237-
free({{{classname}}}->{{{name}}}->data);
252+
if ({{{classname}}}->{{{name}}}) {
253+
free({{{classname}}}->{{{name}}}->data);
254+
{{classname}}->{{name}} = NULL;
255+
}
238256
{{/isBinary}}
239257
{{#isDate}}
240-
free({{{classname}}}->{{{name}}});
258+
if ({{{classname}}}->{{{name}}}) {
259+
free({{{classname}}}->{{{name}}});
260+
{{classname}}->{{name}} = NULL;
261+
}
241262
{{/isDate}}
242263
{{#isDateTime}}
243-
free({{{classname}}}->{{{name}}});
264+
if ({{{classname}}}->{{{name}}}) {
265+
free({{{classname}}}->{{{name}}});
266+
{{classname}}->{{name}} = NULL;
267+
}
244268
{{/isDateTime}}
245269
{{/isPrimitiveType}}
246270
{{/isContainer}}
247271
{{#isContainer}}
248272
{{#isArray}}
249273
{{#isPrimitiveType}}
250-
list_ForEach(listEntry, {{classname}}->{{name}}) {
251-
free(listEntry->data);
274+
if ({{{classname}}}->{{{name}}}) {
275+
list_ForEach(listEntry, {{classname}}->{{name}}) {
276+
free(listEntry->data);
277+
}
278+
list_free({{classname}}->{{name}});
279+
{{classname}}->{{name}} = NULL;
252280
}
253-
list_free({{classname}}->{{name}});
254281
{{/isPrimitiveType}}
255282
{{^isPrimitiveType}}
256-
list_ForEach(listEntry, {{classname}}->{{name}}) {
257-
{{complexType}}_free(listEntry->data);
283+
if ({{{classname}}}->{{{name}}}) {
284+
list_ForEach(listEntry, {{classname}}->{{name}}) {
285+
{{complexType}}_free(listEntry->data);
286+
}
287+
list_free({{classname}}->{{name}});
288+
{{classname}}->{{name}} = NULL;
258289
}
259-
list_free({{classname}}->{{name}});
260290
{{/isPrimitiveType}}
261291
{{/isArray}}
262292
{{#isMap}}
263-
list_ForEach(listEntry, {{classname}}->{{name}}) {
264-
keyValuePair_t *localKeyValue = (keyValuePair_t*) listEntry->data;
265-
free (localKeyValue->key);
266-
free (localKeyValue->value);
267-
keyValuePair_free(localKeyValue);
293+
if ({{{classname}}}->{{{name}}}) {
294+
list_ForEach(listEntry, {{classname}}->{{name}}) {
295+
keyValuePair_t *localKeyValue = (keyValuePair_t*) listEntry->data;
296+
free (localKeyValue->key);
297+
free (localKeyValue->value);
298+
keyValuePair_free(localKeyValue);
299+
}
300+
list_free({{classname}}->{{name}});
301+
{{classname}}->{{name}} = NULL;
268302
}
269-
list_free({{classname}}->{{name}});
270303
{{/isMap}}
271304
{{/isContainer}}
272305
{{/vars}}

samples/client/petstore/c/model/api_response.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,14 @@ void api_response_free(api_response_t *api_response) {
2727
return ;
2828
}
2929
listEntry_t *listEntry;
30-
free(api_response->type);
31-
free(api_response->message);
30+
if (api_response->type) {
31+
free(api_response->type);
32+
api_response->type = NULL;
33+
}
34+
if (api_response->message) {
35+
free(api_response->message);
36+
api_response->message = NULL;
37+
}
3238
free(api_response);
3339
}
3440

samples/client/petstore/c/model/category.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ void category_free(category_t *category) {
2525
return ;
2626
}
2727
listEntry_t *listEntry;
28-
free(category->name);
28+
if (category->name) {
29+
free(category->name);
30+
category->name = NULL;
31+
}
2932
free(category);
3033
}
3134

samples/client/petstore/c/model/order.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ void order_free(order_t *order) {
5050
return ;
5151
}
5252
listEntry_t *listEntry;
53-
free(order->ship_date);
53+
if (order->ship_date) {
54+
free(order->ship_date);
55+
order->ship_date = NULL;
56+
}
5457
free(order);
5558
}
5659

samples/client/petstore/c/model/pet.c

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,28 @@ void pet_free(pet_t *pet) {
5050
return ;
5151
}
5252
listEntry_t *listEntry;
53-
category_free(pet->category);
54-
free(pet->name);
55-
list_ForEach(listEntry, pet->photo_urls) {
56-
free(listEntry->data);
53+
if (pet->category) {
54+
category_free(pet->category);
55+
pet->category = NULL;
5756
}
58-
list_free(pet->photo_urls);
59-
list_ForEach(listEntry, pet->tags) {
60-
tag_free(listEntry->data);
57+
if (pet->name) {
58+
free(pet->name);
59+
pet->name = NULL;
60+
}
61+
if (pet->photo_urls) {
62+
list_ForEach(listEntry, pet->photo_urls) {
63+
free(listEntry->data);
64+
}
65+
list_free(pet->photo_urls);
66+
pet->photo_urls = NULL;
67+
}
68+
if (pet->tags) {
69+
list_ForEach(listEntry, pet->tags) {
70+
tag_free(listEntry->data);
71+
}
72+
list_free(pet->tags);
73+
pet->tags = NULL;
6174
}
62-
list_free(pet->tags);
6375
free(pet);
6476
}
6577

samples/client/petstore/c/model/tag.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ void tag_free(tag_t *tag) {
2525
return ;
2626
}
2727
listEntry_t *listEntry;
28-
free(tag->name);
28+
if (tag->name) {
29+
free(tag->name);
30+
tag->name = NULL;
31+
}
2932
free(tag);
3033
}
3134

samples/client/petstore/c/model/user.c

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,30 @@ void user_free(user_t *user) {
3737
return ;
3838
}
3939
listEntry_t *listEntry;
40-
free(user->username);
41-
free(user->first_name);
42-
free(user->last_name);
43-
free(user->email);
44-
free(user->password);
45-
free(user->phone);
40+
if (user->username) {
41+
free(user->username);
42+
user->username = NULL;
43+
}
44+
if (user->first_name) {
45+
free(user->first_name);
46+
user->first_name = NULL;
47+
}
48+
if (user->last_name) {
49+
free(user->last_name);
50+
user->last_name = NULL;
51+
}
52+
if (user->email) {
53+
free(user->email);
54+
user->email = NULL;
55+
}
56+
if (user->password) {
57+
free(user->password);
58+
user->password = NULL;
59+
}
60+
if (user->phone) {
61+
free(user->phone);
62+
user->phone = NULL;
63+
}
4664
free(user);
4765
}
4866

0 commit comments

Comments
 (0)