From 0117b90aa6d6eda61fba2295be98b12a19d85722 Mon Sep 17 00:00:00 2001 From: Philipp Schafft Date: Thu, 26 Jul 2018 11:57:44 +0000 Subject: [PATCH] Update: Added a (still unused) next member to the http_var_t structure --- httpp/httpp.c | 31 +++++++++++++++++++------------ httpp/httpp.h | 6 ++++-- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/httpp/httpp.c b/httpp/httpp.c index 78dd1cf..663224e 100644 --- a/httpp/httpp.c +++ b/httpp/httpp.c @@ -491,8 +491,10 @@ void httpp_deletevar(http_parser_t *parser, const char *name) if (parser == NULL || name == NULL) return; + memset(&var, 0, sizeof(var)); + var.name = (char*)name; - var.value = NULL; + avl_delete(parser->vars, (void *)&var, _free_vars); } @@ -503,7 +505,7 @@ void httpp_setvar(http_parser_t *parser, const char *name, const char *value) if (name == NULL || value == NULL) return; - var = (http_var_t *)malloc(sizeof(http_var_t)); + var = (http_var_t *)calloc(1, sizeof(http_var_t)); if (var == NULL) return; var->name = strdup(name); @@ -527,8 +529,8 @@ const char *httpp_getvar(http_parser_t *parser, const char *name) return NULL; fp = &found; + memset(&var, 0, sizeof(var)); var.name = (char*)name; - var.value = NULL; if (avl_get_by_key(parser->vars, &var, fp) == 0) return found->value; @@ -543,7 +545,7 @@ static void _httpp_set_param_nocopy(avl_tree *tree, char *name, char *value) if (name == NULL || value == NULL) return; - var = (http_var_t *)malloc(sizeof(http_var_t)); + var = (http_var_t *)calloc(1, sizeof(http_var_t)); if (var == NULL) return; var->name = name; @@ -572,8 +574,8 @@ static const char *_httpp_get_param(avl_tree *tree, const char *name) void *fp; fp = &found; + memset(&var, 0, sizeof(var)); var.name = (char *)name; - var.value = NULL; if (avl_get_by_key(tree, (void *)&var, fp) == 0) return found->value; @@ -650,15 +652,20 @@ static int _compare_vars(void *compare_arg, void *a, void *b) static int _free_vars(void *key) { - http_var_t *var; + http_var_t *var, *next; - var = (http_var_t *)key; + next = (http_var_t *)key; - if (var->name) - free(var->name); - if (var->value) - free(var->value); - free(var); + while (next) { + var = next; + next = var->next; + + if (var->name) + free(var->name); + if (var->value) + free(var->value); + free(var); + } return 1; } diff --git a/httpp/httpp.h b/httpp/httpp.h index 15a9a50..e3f1e12 100644 --- a/httpp/httpp.h +++ b/httpp/httpp.h @@ -61,10 +61,12 @@ typedef enum httpp_request_type_tag { httpp_req_unknown } httpp_request_type_e; -typedef struct http_var_tag { +typedef struct http_var_tag http_var_t; +struct http_var_tag { char *name; char *value; -} http_var_t; + http_var_t *next; +}; typedef struct http_varlist_tag { http_var_t var;