Merged revisions 59225 via svnmerge from
authorSteve Murphy <murf@digium.com>
Mon, 26 Mar 2007 20:27:02 +0000 (20:27 +0000)
committerSteve Murphy <murf@digium.com>
Mon, 26 Mar 2007 20:27:02 +0000 (20:27 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r59225 | murf | 2007-03-26 14:06:12 -0600 (Mon, 26 Mar 2007) | 1 line

Fix for 9257; by eliminating the globals in main/config.c, we make it thread-safe, which is a minimum requirement.
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@59226 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/config.c

index ee9d03a..a3cf96c 100644 (file)
@@ -62,15 +62,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
 static char *extconfig_conf = "extconfig.conf";
 
-/*! Growable string buffer */
-static char *comment_buffer;   /*!< this will be a comment collector.*/
-static int   comment_buffer_size;  /*!< the amount of storage so far alloc'd for the comment_buffer */
-
-static char *lline_buffer;    /*!< A buffer for stuff behind the ; */
-static int  lline_buffer_size;
-
 
 /*! \brief Structure to keep comments for rewriting configuration files */
+/*! \brief Structure to keep comments for rewriting configuration files */
 struct ast_comment {
        struct ast_comment *next;
        char cmt[0];
@@ -78,71 +72,70 @@ struct ast_comment {
 
 #define CB_INCR 250
 
-static void CB_INIT(void)
+static void CB_INIT(char **comment_buffer, int *comment_buffer_size, char **lline_buffer, int *lline_buffer_size)
 {
-       if (!comment_buffer) {
-               comment_buffer = ast_malloc(CB_INCR);
-               if (!comment_buffer)
+       if (!(*comment_buffer)) {
+               *comment_buffer = ast_malloc(CB_INCR);
+               if (!(*comment_buffer))
                        return;
-               comment_buffer[0] = 0;
-               comment_buffer_size = CB_INCR;
-               lline_buffer = ast_malloc(CB_INCR);
-               if (!lline_buffer)
+               (*comment_buffer)[0] = 0;
+               *comment_buffer_size = CB_INCR;
+               *lline_buffer = ast_malloc(CB_INCR);
+               if (!(*lline_buffer))
                        return;
-               lline_buffer[0] = 0;
-               lline_buffer_size = CB_INCR;
+               (*lline_buffer)[0] = 0;
+               *lline_buffer_size = CB_INCR;
        } else {
-               comment_buffer[0] = 0;
-               lline_buffer[0] = 0;
+               (*comment_buffer)[0] = 0;
+               (*lline_buffer)[0] = 0;
        }
 }
 
-static void  CB_ADD(char *str)
+static void  CB_ADD(char **comment_buffer, int *comment_buffer_size, char *str)
 {
-       int rem = comment_buffer_size - strlen(comment_buffer) - 1;
+       int rem = *comment_buffer_size - strlen(*comment_buffer) - 1;
        int siz = strlen(str);
        if (rem < siz+1) {
-               comment_buffer = ast_realloc(comment_buffer, comment_buffer_size + CB_INCR + siz + 1);
-               if (!comment_buffer)
+               *comment_buffer = ast_realloc(*comment_buffer, *comment_buffer_size + CB_INCR + siz + 1);
+               if (!(*comment_buffer))
                        return;
-               comment_buffer_size += CB_INCR+siz+1;
+               *comment_buffer_size += CB_INCR+siz+1;
        }
-       strcat(comment_buffer,str);
+       strcat(*comment_buffer,str);
 }
 
-static void  CB_ADD_LEN(char *str, int len)
+static void  CB_ADD_LEN(char **comment_buffer, int *comment_buffer_size, char *str, int len)
 {
-       int cbl = strlen(comment_buffer) + 1;
-       int rem = comment_buffer_size - cbl;
+       int cbl = strlen(*comment_buffer) + 1;
+       int rem = *comment_buffer_size - cbl;
        if (rem < len+1) {
-               comment_buffer = ast_realloc(comment_buffer, comment_buffer_size + CB_INCR + len + 1);
-               if (!comment_buffer)
+               *comment_buffer = ast_realloc(*comment_buffer, *comment_buffer_size + CB_INCR + len + 1);
+               if (!(*comment_buffer))
                        return;
-               comment_buffer_size += CB_INCR+len+1;
+               *comment_buffer_size += CB_INCR+len+1;
        }
-       strncat(comment_buffer,str,len);
-       comment_buffer[cbl+len-1] = 0;
+       strncat(*comment_buffer,str,len);
+       (*comment_buffer)[cbl+len-1] = 0;
 }
 
-static void  LLB_ADD(char *str)
+static void  LLB_ADD(char **lline_buffer, int *lline_buffer_size, char *str)
 {
-       int rem = lline_buffer_size - strlen(lline_buffer) - 1;
+       int rem = *lline_buffer_size - strlen(*lline_buffer) - 1;
        int siz = strlen(str);
        if (rem < siz+1) {
-               lline_buffer = ast_realloc(lline_buffer, lline_buffer_size + CB_INCR + siz + 1);
-               if (!lline_buffer) 
+               *lline_buffer = ast_realloc(*lline_buffer, *lline_buffer_size + CB_INCR + siz + 1);
+               if (!(*lline_buffer)) 
                        return;
-               lline_buffer_size += CB_INCR + siz + 1;
+               *lline_buffer_size += CB_INCR + siz + 1;
        }
-       strcat(lline_buffer,str);
+       strcat(*lline_buffer,str);
 }
 
-static void CB_RESET(void )  
+static void CB_RESET(char **comment_buffer, char **lline_buffer)  
 { 
-       comment_buffer[0] = 0; 
-       lline_buffer[0] = 0;
+       (*comment_buffer)[0] = 0; 
+       (*lline_buffer)[0] = 0;
 }
-               
 
 
 static struct ast_comment *ALLOC_COMMENT(const char *buffer)
@@ -600,7 +593,8 @@ void ast_config_set_current_category(struct ast_config *cfg, const struct ast_ca
        cfg->current = (struct ast_category *) cat;
 }
 
-static int process_text_line(struct ast_config *cfg, struct ast_category **cat, char *buf, int lineno, const char *configfile, int withcomments)
+static int process_text_line(struct ast_config *cfg, struct ast_category **cat, char *buf, int lineno, const char *configfile, int withcomments,
+                               char **comment_buffer, int *comment_buffer_size, char **lline_buffer, int *lline_buffer_size)
 {
        char *c;
        char *cur = buf;
@@ -628,14 +622,14 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                        return -1;
                }
                /* add comments */
-               if (withcomments && comment_buffer && comment_buffer[0] ) {
-                       newcat->precomments = ALLOC_COMMENT(comment_buffer);
+               if (withcomments && *comment_buffer && (*comment_buffer)[0] ) {
+                       newcat->precomments = ALLOC_COMMENT(*comment_buffer);
                }
-               if (withcomments && lline_buffer && lline_buffer[0] ) {
-                       newcat->sameline = ALLOC_COMMENT(lline_buffer);
+               if (withcomments && *lline_buffer && (*lline_buffer)[0] ) {
+                       newcat->sameline = ALLOC_COMMENT(*lline_buffer);
                }
                if ( withcomments )
-                       CB_RESET();
+                       CB_RESET(comment_buffer, lline_buffer);
                
                /* If there are options or categories to inherit from, process them now */
                if (c) {
@@ -649,7 +643,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                                        (*cat)->ignored = 1;
                                } else if (!strcasecmp(cur, "+")) {
                                        *cat = category_get(cfg, catname, 1);
-                                       if (!*cat) {
+                                       if (!(*cat)) {
                                                ast_config_destroy(cfg);
                                                if (newcat)
                                                        ast_category_destroy(newcat);
@@ -684,7 +678,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                        *c = '\0';
                        /* Find real argument */
                        c = ast_skip_blanks(c + 1);
-                       if (!*c)
+                       if (!(*c))
                                c = NULL;
                } else 
                        c = NULL;
@@ -738,7 +732,7 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                        ast_log(LOG_WARNING, "Unknown directive '%s' at line %d of %s\n", cur, lineno, configfile);
        } else {
                /* Just a line (variable = value) */
-               if (!*cat) {
+               if (!(*cat)) {
                        ast_log(LOG_WARNING,
                                "parse error: No category context for line %d of %s\n", lineno, configfile);
                        return -1;
@@ -760,14 +754,14 @@ static int process_text_line(struct ast_config *cfg, struct ast_category **cat,
                                v->blanklines = 0;
                                ast_variable_append(*cat, v);
                                /* add comments */
-                               if (withcomments && comment_buffer && comment_buffer[0] ) {
-                                       v->precomments = ALLOC_COMMENT(comment_buffer);
+                               if (withcomments && *comment_buffer && (*comment_buffer)[0] ) {
+                                       v->precomments = ALLOC_COMMENT(*comment_buffer);
                                }
-                               if (withcomments && lline_buffer && lline_buffer[0] ) {
-                                       v->sameline = ALLOC_COMMENT(lline_buffer);
+                               if (withcomments && *lline_buffer && (*lline_buffer)[0] ) {
+                                       v->sameline = ALLOC_COMMENT(*lline_buffer);
                                }
                                if ( withcomments )
-                                       CB_RESET();
+                                       CB_RESET(comment_buffer, lline_buffer);
                                
                        } else {
                                return -1;
@@ -790,6 +784,13 @@ static struct ast_config *config_text_file_load(const char *database, const char
        struct ast_category *cat = NULL;
        int count = 0;
        struct stat statbuf;
+       /*! Growable string buffer */
+       char *comment_buffer=0;   /*!< this will be a comment collector.*/
+       int   comment_buffer_size=0;  /*!< the amount of storage so far alloc'd for the comment_buffer */
+
+       char *lline_buffer=0;    /*!< A buffer for stuff behind the ; */
+       int  lline_buffer_size=0;
+
        
        cat = ast_config_get_current_category(cfg);
 
@@ -800,7 +801,7 @@ static struct ast_config *config_text_file_load(const char *database, const char
        }
 
        if (withcomments) {
-               CB_INIT();
+               CB_INIT(&comment_buffer, &comment_buffer_size, &lline_buffer, &lline_buffer_size);
                if (!lline_buffer || !comment_buffer) {
                        ast_log(LOG_ERROR, "Failed to initialize the comment buffer!\n");
                        return NULL;
@@ -856,7 +857,7 @@ static struct ast_config *config_text_file_load(const char *database, const char
                        lineno++;
                        if (fgets(buf, sizeof(buf), f)) {
                                if ( withcomments ) {
-                                       CB_ADD(lline_buffer);       /* add the current lline buffer to the comment buffer */
+                                       CB_ADD(&comment_buffer, &comment_buffer_size, lline_buffer);       /* add the current lline buffer to the comment buffer */
                                        lline_buffer[0] = 0;        /* erase the lline buffer */
                                }
                                
@@ -894,8 +895,8 @@ static struct ast_config *config_text_file_load(const char *database, const char
                                                                char *oldptr;
                                                                oldptr = process_buf + strlen(process_buf);
                                                                if ( withcomments ) {
-                                                                       CB_ADD(";");
-                                                                       CB_ADD_LEN(oldptr+1,new_buf-oldptr-1);
+                                                                       CB_ADD(&comment_buffer, &comment_buffer_size, ";");
+                                                                       CB_ADD_LEN(&comment_buffer, &comment_buffer_size, oldptr+1, new_buf-oldptr-1);
                                                                }
                                                                
                                                                memmove(oldptr, new_buf, strlen(new_buf) + 1);
@@ -908,7 +909,7 @@ static struct ast_config *config_text_file_load(const char *database, const char
                                                        /* If ; is found, and we are not nested in a comment, 
                                                           we immediately stop all comment processing */
                                                        if ( withcomments ) {
-                                                               LLB_ADD(comment_p);
+                                                               LLB_ADD(&lline_buffer, &lline_buffer_size, comment_p);
                                                        }
                                                        *comment_p = '\0'; 
                                                        new_buf = comment_p;
@@ -918,13 +919,13 @@ static struct ast_config *config_text_file_load(const char *database, const char
                                }
                                if ( withcomments && comment && !process_buf )
                                {
-                                       CB_ADD(buf);  /* the whole line is a comment, store it */
+                                       CB_ADD(&comment_buffer, &comment_buffer_size, buf);  /* the whole line is a comment, store it */
                                }
                                
                                if (process_buf) {
                                        char *buf = ast_strip(process_buf);
                                        if (!ast_strlen_zero(buf)) {
-                                               if (process_text_line(cfg, &cat, buf, lineno, fn, withcomments)) {
+                                               if (process_text_line(cfg, &cat, buf, lineno, fn, withcomments, &comment_buffer, &comment_buffer_size, &lline_buffer, &lline_buffer_size)) {
                                                        cfg = NULL;
                                                        break;
                                                }