From 3bce5a9dfa0e30942cac097a3161ada9c5bf60ee Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Wed, 1 Nov 2017 17:47:57 -0500 Subject: [PATCH] Stasis/ARI: Fix off-nominal path json memory leaks. Change-Id: Id569c624c426e3b22a99936473c730592d8b83fb --- main/sorcery.c | 1 + res/ari/resource_asterisk.c | 7 +++++++ res/ari/resource_sounds.c | 1 + res/res_ari.c | 4 +++- res/stasis/messaging.c | 4 +++- 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/main/sorcery.c b/main/sorcery.c index 713b038e64..1bdf2c2f85 100644 --- a/main/sorcery.c +++ b/main/sorcery.c @@ -1597,6 +1597,7 @@ struct ast_json *ast_sorcery_objectset_json_create(const struct ast_sorcery *sor int res = 0; if (!object_type || !json) { + ast_json_unref(json); return NULL; } diff --git a/res/ari/resource_asterisk.c b/res/ari/resource_asterisk.c index 30684d2760..dafe9a6027 100644 --- a/res/ari/resource_asterisk.c +++ b/res/ari/resource_asterisk.c @@ -435,6 +435,10 @@ void ast_ari_asterisk_list_modules(struct ast_variable *headers, struct ast_json *json; json = ast_json_array_create(); + if (!json) { + ast_ari_response_alloc_failed(response); + return; + } ast_update_module_list_data(&process_module_list, NULL, json); ast_ari_response_ok(response, json); @@ -507,6 +511,7 @@ void ast_ari_asterisk_get_module(struct ast_variable *headers, ast_ari_response_error( response, 409, "Conflict", "Module information could not be retrieved"); + ast_json_unref(json); return; } @@ -669,10 +674,12 @@ void ast_ari_asterisk_list_log_channels(struct ast_variable *headers, if (res == AST_LOGGER_FAILURE) { ast_ari_response_error(response, 500, "Internal Server Error", "Response body is not valid"); + ast_json_unref(json); return; } else if (res == AST_LOGGER_ALLOC_ERROR) { ast_ari_response_error(response, 500, "Internal Server Error", "Allocation Failed"); + ast_json_unref(json); return; } diff --git a/res/ari/resource_sounds.c b/res/ari/resource_sounds.c index 5a523d3877..76a4d94362 100644 --- a/res/ari/resource_sounds.c +++ b/res/ari/resource_sounds.c @@ -204,6 +204,7 @@ void ast_ari_sounds_list(struct ast_variable *headers, if (!ast_json_array_size(sounds_blob)) { ast_ari_response_error(response, 404, "Not Found", "No sounds found that matched the query"); + ast_json_unref(sounds_blob); return; } diff --git a/res/res_ari.c b/res/res_ari.c index 1ac5327358..e4b50ab117 100644 --- a/res/res_ari.c +++ b/res/res_ari.c @@ -983,9 +983,11 @@ static int ast_ari_callback(struct ast_tcptls_session_instance *ser, struct ast_str *buf = ast_str_create(512); char *str = ast_json_dump_string_format(body, ast_ari_json_format()); - if (!buf) { + if (!buf || !str) { ast_http_request_close_on_completion(ser); ast_http_error(ser, 500, "Server Error", "Out of memory"); + ast_json_free(str); + ast_free(buf); goto request_failed; } diff --git a/res/stasis/messaging.c b/res/stasis/messaging.c index 229a3a6462..d2df3ff0c9 100644 --- a/res/stasis/messaging.c +++ b/res/stasis/messaging.c @@ -266,6 +266,7 @@ static struct ast_json *msg_to_json(struct ast_msg *msg) json_vars = ast_json_array_create(); if (!json_vars) { + ast_msg_var_iterator_destroy(it_vars); return NULL; } @@ -274,7 +275,8 @@ static struct ast_json *msg_to_json(struct ast_msg *msg) json_tuple = ast_json_pack("{s: s}", name, value); if (!json_tuple) { - ast_json_free(json_vars); + ast_json_unref(json_vars); + ast_msg_var_iterator_destroy(it_vars); return NULL; }