diff --git a/include/asterisk/http.h b/include/asterisk/http.h index 1f46b1eed1290a5b067d90b736607e29f3f9df3f..218ac3f1ae900f6c7842b3054d78571947c990e3 100644 --- a/include/asterisk/http.h +++ b/include/asterisk/http.h @@ -87,9 +87,13 @@ struct ast_http_uri { unsigned int supports_get:1; /*! This handler accepts POST requests */ unsigned int supports_post:1; + /*! Structure is malloc'd */ + unsigned int mallocd:1; + /*! Data structure is malloc'd */ + unsigned int dmallocd:1; /*! Data to bind to the uri if needed */ void *data; - /*! Key to be used for unlinking if multipile URIs registerd */ + /*! Key to be used for unlinking if multiple URIs registered */ const char *key; }; diff --git a/main/http.c b/main/http.c index bb6ae61219b58dfcef12ea315b02c5fe26d3b972..d08b17fa4b4db5342f71a818fcbc59e3fca26177 100644 --- a/main/http.c +++ b/main/http.c @@ -389,6 +389,12 @@ void ast_http_uri_unlink_all_with_key(const char *key) if (!strcmp(urih->key, key)) { AST_RWLIST_REMOVE_CURRENT(entry); } + if (urih->dmallocd) { + ast_free(urih->data); + } + if (urih->mallocd) { + ast_free(urih); + } } AST_RWLIST_TRAVERSE_SAFE_END AST_RWLIST_UNLOCK(&uris); diff --git a/res/res_http_post.c b/res/res_http_post.c index f1ae7a7da5c043393fe6267fb71192e4bd33cf74..2e4a20a1d44358afc05957d6c4ae85cdff7862ee 100644 --- a/res/res_http_post.c +++ b/res/res_http_post.c @@ -289,12 +289,15 @@ static int __ast_http_post_load(int reload) struct ast_str *ds; if (!(urih = ast_calloc(sizeof(*urih), 1))) { + ast_config_destroy(cfg); return -1; } - if (!(ds = ast_str_create(32))) + if (!(ds = ast_str_create(32))) { + ast_free(urih); + ast_config_destroy(cfg); return -1; - + } urih->description = ast_strdup("HTTP POST mapping"); urih->uri = ast_strdup(v->name); @@ -305,6 +308,7 @@ static int __ast_http_post_load(int reload) urih->supports_post = 1; urih->callback = http_post_callback; urih->key = __FILE__; + urih->mallocd = urih->dmallocd = 1; ast_http_uri_link(urih); } @@ -323,7 +327,6 @@ static int unload_module(void) static int reload(void) { - __ast_http_post_load(1); return AST_MODULE_LOAD_SUCCESS;