[prelude-cvslog] r6462 - trunk/libprelude/src

noreply at prelude-ids.org noreply at prelude-ids.org
Fri May 27 08:37:43 CEST 2005


Author: yoann
Date: 2005-05-27 08:37:42 +0200 (Fri, 27 May 2005)
New Revision: 6462

Modified:
   trunk/libprelude/src/config-engine.c
Log:
Fix parsing of unquoted value. Always read last line even if not \n terminated.


Modified: trunk/libprelude/src/config-engine.c
===================================================================
--- trunk/libprelude/src/config-engine.c	2005-05-27 05:15:53 UTC (rev 6461)
+++ trunk/libprelude/src/config-engine.c	2005-05-27 06:37:42 UTC (rev 6462)
@@ -276,22 +276,31 @@
 static int strip_value(char **out, const char *in, size_t tlen)
 {
         size_t slen, elen;
+        prelude_bool_t have_start_quote = FALSE;
+                
+        in += slen = strspn(in, " \t");
+        if ( *in == '"' ) {
+                in++; slen++;
+                have_start_quote = TRUE;
+        }
         
-        slen = strspn(in, " \"\t");
-
         elen = tlen - slen;
-        if ( ! elen ) {
-                *out = strdup("");
-                return (*out) ? 0 : prelude_error_from_errno(errno);
-        }
+        if ( ! elen )
+                return 0;
         
-        elen--;        
-        while ( in[elen] == ' ' || in[elen] == '\t' || in[elen] == '\"' ) {
+        while ( in[elen - 1] == ' ' || in[elen - 1] == '\t' )
                 elen--;
+
+        if ( have_start_quote && elen ) {                
+                if ( in[elen - 1] == '"' )
+                        elen--;
+                else {
+                        in--;
+                        elen++;
+                }
         }
         
-        *out = strndup(in + slen, elen + 1);
-
+        *out = strndup(in, elen);        
         return (*out) ? 0 : prelude_error_from_errno(errno);
 }
 
@@ -317,7 +326,7 @@
         if ( ! ptr )
                 return 0;
         
-        return  strip_value(value, ptr + 1, strlen(ptr + 1));
+        return strip_value(value, ptr + 1, strlen(ptr + 1));
 }
 
 
@@ -325,7 +334,7 @@
 {
         int ret;
         char *ptr;
-
+        
         buf += strspn(buf, "\n [");
         
         ptr = strchr(buf, ']');
@@ -368,7 +377,7 @@
                 if ( ! is_section(cfg->content[i]) )
                         continue;
                 
-                ret = parse_section_buffer(cfg->content[i], &entry, &value);                
+                ret = parse_section_buffer(cfg->content[i], &entry, &value);
                 if ( ret < 0 )
                         continue;
                 
@@ -718,20 +727,18 @@
 {
         char *ptr;
         
-        if ( ! *line ) 
-                free_val(section);
-        
-        if ( ! cfg->content || *line >= cfg->elements )
-                return -1;
-
         free_val(entry);
         free_val(value);
         free_val(section);
+                
+        if ( ! cfg->content || *line >= cfg->elements )
+                return -1;
         
-        for ( (*line)++ ; *line < cfg->elements; (*line)++ ) {
+        while ( *line < cfg->elements ) {
                 
-                ptr = cfg->content[*line - 1];
+                ptr = cfg->content[*line];
                 ptr += strspn(ptr, " \t");
+                (*line)++;
                 
                 if ( ! *ptr || is_line_commented(ptr) )
                         continue;



More information about the Prelude-cvslog mailing list