libprelude/master: Fix NULL pointer dereference with empty value.
[email protected] Fri, 5 Jun 2009 18:45:48 +0200 (CEST)
| Newsgroups | gmane.comp.security.ids.prelude.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit 7d53cc678e04594cf4d1809e86c29c7fb6189a49 Author: Yoann Vandoorselaere <[email protected]> Date: Thu Jun 4 15:38:09 2009 +0200 Fix NULL pointer dereference with empty value. Previously config-engine would not handle setting configuration key to empty value. Thanks Jérôme Soyer <[email protected]> for pointing out this. ======================================== src/config-engine.c | 6 +++++- src/variable.c | 21 ++++++++++++++------- 2 files changed, 19 insertions(+), 8 deletions(-) ======================================== diff --git a/src/config-engine.c b/src/config-engine.c index dac70c5..091b69e 100644 --- a/src/config-engine.c +++ b/src/config-engine.c @@ -279,6 +279,8 @@ static int strip_value(char **out, const char *in, size_t tlen) size_t slen, elen; prelude_bool_t have_start_quote = FALSE; + *out = NULL; + in += slen = strspn(in, " \t\r"); if ( *in == '"' ) { in++; slen++; @@ -379,7 +381,9 @@ static int parse_buffer(const char *str, char **entry, char **value) if ( ret < 0 ) return ret; - ret = value_resolve_variable(val, value); + if ( val ) + ret = value_resolve_variable(val, value); + free_val(&val); if ( ret < 0 ) return ret; diff --git a/src/variable.c b/src/variable.c index 2001c64..8f87f9b 100644 --- a/src/variable.c +++ b/src/variable.c @@ -80,11 +80,15 @@ static int create_entry(const char *variable, const char *value) return prelude_error_from_errno(errno); } - item->value = strdup(value); - if ( ! item->value ) { - free(item->variable); - free(item); - return prelude_error_from_errno(errno); + if ( ! value ) + item->value = NULL; + else { + item->value = strdup(value); + if ( ! item->value ) { + free(item->variable); + free(item); + return prelude_error_from_errno(errno); + } } prelude_list_add_tail(&variable_list, &item->list); @@ -98,7 +102,10 @@ static void destroy_variable(variable_t *item) prelude_list_del(&item->list); free(item->variable); - free(item->value); + + if ( item->value ) + free(item->value); + free(item); } @@ -145,7 +152,7 @@ int variable_set(const char *variable, const char *value) if ( item->value ) free(item->value); - item->value = strdup(value); + item->value = (value) ? strdup(value) : NULL; } return ( ret == 0 || item ) ? 0 : -1; _______________________________________________ Prelude-cvslog site list [email protected] http://lists.prelude-ids.org/mailman/listinfo/prelude-cvslog