[C][Client] Fix coredump when releasing the memory of an incompleted resource (#8190)

This commit is contained in:
Hui Yu
2020-12-16 17:20:36 +08:00
committed by GitHub
parent 180fae02cd
commit f0c4fd7ab8
7 changed files with 117 additions and 39 deletions

View File

@@ -214,59 +214,92 @@ void {{classname}}_free({{classname}}_t *{{classname}}) {
{{^isPrimitiveType}}
{{#isModel}}
{{^isEnum}}
{{{complexType}}}_free({{{classname}}}->{{{name}}});
if ({{{classname}}}->{{{name}}}) {
{{{complexType}}}_free({{{classname}}}->{{{name}}});
{{classname}}->{{name}} = NULL;
}
{{/isEnum}}
{{/isModel}}
{{#isUuid}}
free({{{classname}}}->{{{name}}});
if ({{{classname}}}->{{{name}}}) {
free({{{classname}}}->{{{name}}});
{{classname}}->{{name}} = NULL;
}
{{/isUuid}}
{{#isEmail}}
free({{{classname}}}->{{{name}}});
if ({{{classname}}}->{{{name}}}) {
free({{{classname}}}->{{{name}}});
{{classname}}->{{name}} = NULL;
}
{{/isEmail}}
{{#isFreeFormObject}}
object_free({{{classname}}}->{{{name}}});
if ({{{classname}}}->{{{name}}}) {
object_free({{{classname}}}->{{{name}}});
{{classname}}->{{name}} = NULL;
}
{{/isFreeFormObject}}
{{/isPrimitiveType}}
{{#isPrimitiveType}}
{{^isEnum}}
{{#isString}}
free({{{classname}}}->{{{name}}});
if ({{{classname}}}->{{{name}}}) {
free({{{classname}}}->{{{name}}});
{{classname}}->{{name}} = NULL;
}
{{/isString}}
{{/isEnum}}
{{#isBinary}}
free({{{classname}}}->{{{name}}}->data);
if ({{{classname}}}->{{{name}}}) {
free({{{classname}}}->{{{name}}}->data);
{{classname}}->{{name}} = NULL;
}
{{/isBinary}}
{{#isDate}}
free({{{classname}}}->{{{name}}});
if ({{{classname}}}->{{{name}}}) {
free({{{classname}}}->{{{name}}});
{{classname}}->{{name}} = NULL;
}
{{/isDate}}
{{#isDateTime}}
free({{{classname}}}->{{{name}}});
if ({{{classname}}}->{{{name}}}) {
free({{{classname}}}->{{{name}}});
{{classname}}->{{name}} = NULL;
}
{{/isDateTime}}
{{/isPrimitiveType}}
{{/isContainer}}
{{#isContainer}}
{{#isArray}}
{{#isPrimitiveType}}
list_ForEach(listEntry, {{classname}}->{{name}}) {
free(listEntry->data);
if ({{{classname}}}->{{{name}}}) {
list_ForEach(listEntry, {{classname}}->{{name}}) {
free(listEntry->data);
}
list_free({{classname}}->{{name}});
{{classname}}->{{name}} = NULL;
}
list_free({{classname}}->{{name}});
{{/isPrimitiveType}}
{{^isPrimitiveType}}
list_ForEach(listEntry, {{classname}}->{{name}}) {
{{complexType}}_free(listEntry->data);
if ({{{classname}}}->{{{name}}}) {
list_ForEach(listEntry, {{classname}}->{{name}}) {
{{complexType}}_free(listEntry->data);
}
list_free({{classname}}->{{name}});
{{classname}}->{{name}} = NULL;
}
list_free({{classname}}->{{name}});
{{/isPrimitiveType}}
{{/isArray}}
{{#isMap}}
list_ForEach(listEntry, {{classname}}->{{name}}) {
keyValuePair_t *localKeyValue = (keyValuePair_t*) listEntry->data;
free (localKeyValue->key);
free (localKeyValue->value);
keyValuePair_free(localKeyValue);
if ({{{classname}}}->{{{name}}}) {
list_ForEach(listEntry, {{classname}}->{{name}}) {
keyValuePair_t *localKeyValue = (keyValuePair_t*) listEntry->data;
free (localKeyValue->key);
free (localKeyValue->value);
keyValuePair_free(localKeyValue);
}
list_free({{classname}}->{{name}});
{{classname}}->{{name}} = NULL;
}
list_free({{classname}}->{{name}});
{{/isMap}}
{{/isContainer}}
{{/vars}}

View File

@@ -27,8 +27,14 @@ void api_response_free(api_response_t *api_response) {
return ;
}
listEntry_t *listEntry;
free(api_response->type);
free(api_response->message);
if (api_response->type) {
free(api_response->type);
api_response->type = NULL;
}
if (api_response->message) {
free(api_response->message);
api_response->message = NULL;
}
free(api_response);
}

View File

@@ -25,7 +25,10 @@ void category_free(category_t *category) {
return ;
}
listEntry_t *listEntry;
free(category->name);
if (category->name) {
free(category->name);
category->name = NULL;
}
free(category);
}

View File

@@ -50,7 +50,10 @@ void order_free(order_t *order) {
return ;
}
listEntry_t *listEntry;
free(order->ship_date);
if (order->ship_date) {
free(order->ship_date);
order->ship_date = NULL;
}
free(order);
}

View File

@@ -50,16 +50,28 @@ void pet_free(pet_t *pet) {
return ;
}
listEntry_t *listEntry;
category_free(pet->category);
free(pet->name);
list_ForEach(listEntry, pet->photo_urls) {
free(listEntry->data);
if (pet->category) {
category_free(pet->category);
pet->category = NULL;
}
list_free(pet->photo_urls);
list_ForEach(listEntry, pet->tags) {
tag_free(listEntry->data);
if (pet->name) {
free(pet->name);
pet->name = NULL;
}
if (pet->photo_urls) {
list_ForEach(listEntry, pet->photo_urls) {
free(listEntry->data);
}
list_free(pet->photo_urls);
pet->photo_urls = NULL;
}
if (pet->tags) {
list_ForEach(listEntry, pet->tags) {
tag_free(listEntry->data);
}
list_free(pet->tags);
pet->tags = NULL;
}
list_free(pet->tags);
free(pet);
}

View File

@@ -25,7 +25,10 @@ void tag_free(tag_t *tag) {
return ;
}
listEntry_t *listEntry;
free(tag->name);
if (tag->name) {
free(tag->name);
tag->name = NULL;
}
free(tag);
}

View File

@@ -37,12 +37,30 @@ void user_free(user_t *user) {
return ;
}
listEntry_t *listEntry;
free(user->username);
free(user->first_name);
free(user->last_name);
free(user->email);
free(user->password);
free(user->phone);
if (user->username) {
free(user->username);
user->username = NULL;
}
if (user->first_name) {
free(user->first_name);
user->first_name = NULL;
}
if (user->last_name) {
free(user->last_name);
user->last_name = NULL;
}
if (user->email) {
free(user->email);
user->email = NULL;
}
if (user->password) {
free(user->password);
user->password = NULL;
}
if (user->phone) {
free(user->phone);
user->phone = NULL;
}
free(user);
}