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