From 9f1538687a0322524ed909ae0cd4e6bafad50bce Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Mon, 20 Dec 2010 13:53:10 +0000 Subject: [PATCH] Add checks for allocation errors in config node clonning. Add checks for clonning allocation a fail-out when something is not allocated correctly. Also move var declaration to the begining of the function and fix log_error messages. --- WHATS_NEW | 1 + lib/config/config.c | 57 +++++++++++++++++++++++++++++++-------------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 9e809a1a4..f7691193b 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.79 - =================================== + Add checks for allocation errors in config node clonning. Fix error path if regex engine cannot be created in _build_matcher(). Use char* arithmetic in target_version(), _process_all(), _targets(). Fixing const cast gcc warnings in the code. diff --git a/lib/config/config.c b/lib/config/config.c index 1df8d09e9..72908f2a3 100644 --- a/lib/config/config.c +++ b/lib/config/config.c @@ -1330,30 +1330,53 @@ unsigned maybe_config_section(const char *str, unsigned len) static struct config_value *_clone_config_value(struct dm_pool *mem, const struct config_value *v) { + struct config_value *new_cv; + if (!v) return NULL; - struct config_value *new = _create_value(mem); - new->type = v->type; - if (v->type == CFG_STRING) - new->v.str = dm_pool_strdup(mem, v->v.str); - else - new->v = v->v; - new->next = _clone_config_value(mem, v->next); - return new; + + if (!(new_cv = _create_value(mem))) { + log_error("Failed to clone config value."); + return NULL; + } + + new_cv->type = v->type; + if (v->type == CFG_STRING) { + if (!(new_cv->v.str = dm_pool_strdup(mem, v->v.str))) { + log_error("Failed to clone config string value."); + return NULL; + } + } else + new_cv->v = v->v; + + if (v->next && !(new_cv->next = _clone_config_value(mem, v->next))) + return_NULL; + + return new_cv; } struct config_node *clone_config_node(struct dm_pool *mem, const struct config_node *cn, int siblings) { + struct config_node *new_cn; + if (!cn) return NULL; - struct config_node *new = _create_node(mem); - new->key = dm_pool_strdup(mem, cn->key); - new->child = clone_config_node(mem, cn->child, 1); - new->v = _clone_config_value(mem, cn->v); - if (siblings) - new->sib = clone_config_node(mem, cn->sib, siblings); - else - new->sib = NULL; - return new; + + if (!(new_cn = _create_node(mem))) { + log_error("Failed to clone config node."); + return NULL; + } + + if ((cn->key && !(new_cn->key = dm_pool_strdup(mem, cn->key)))) { + log_error("Failed to clone config node key."); + return NULL; + } + + if ((cn->v && !(new_cn->v = _clone_config_value(mem, cn->v))) || + (cn->child && !(new_cn->child = clone_config_node(mem, cn->child, 1))) || + (siblings && cn->sib && !(new_cn->sib = clone_config_node(mem, cn->sib, siblings)))) + return_NULL; /* 'new_cn' released with mem pool */ + + return new_cn; } -- 2.43.5