Ensure that we can have commas within cdr values.
authorTilghman Lesher <tilghman@meg.abyt.es>
Tue, 13 Apr 2010 16:33:21 +0000 (16:33 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Tue, 13 Apr 2010 16:33:21 +0000 (16:33 +0000)
(closes issue #17001)
 Reported by: snuffy
 Patches:
       20100412__issue17001.diff.txt uploaded by tilghman (license 14)
 Tested by: snuffy

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

cdr/cdr_sqlite3_custom.c

index eb2e092..88f5776 100644 (file)
@@ -50,6 +50,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/pbx.h"
 #include "asterisk/utils.h"
 #include "asterisk/cli.h"
+#include "asterisk/app.h"
 
 AST_MUTEX_DEFINE_STATIC(lock);
 
@@ -63,8 +64,8 @@ static char table[80];
 static char *columns;
 
 struct values {
-       char *expression;
        AST_LIST_ENTRY(values) list;
+       char expression[1];
 };
 
 static AST_LIST_HEAD_STATIC(sql_values, values);
@@ -117,9 +118,12 @@ static int load_column_config(const char *tmp)
 
 static int load_values_config(const char *tmp)
 {
-       char *val = NULL;
        char *vals = NULL, *save = NULL;
        struct values *value = NULL;
+       int i;
+       AST_DECLARE_APP_ARGS(val,
+               AST_APP_ARG(ues)[200]; /* More than 200 columns in this CDR?  Yeah, right... */
+       );
 
        if (ast_strlen_zero(tmp)) {
                ast_log(LOG_WARNING, "Values not specified. Module not loaded.\n");
@@ -129,17 +133,17 @@ static int load_values_config(const char *tmp)
                ast_log(LOG_ERROR, "Out of memory creating temporary buffer for value '%s'\n", tmp);
                return -1;
        }
-       while ((val = strsep(&vals, ","))) {
+       AST_STANDARD_RAW_ARGS(val, vals);
+       for (i = 0; i < val.argc; i++) {
                /* Strip the single quotes off if they are there */
-               val = ast_strip_quoted(val, "'", "'");
-               value = ast_calloc(sizeof(char), sizeof(*value) + strlen(val) + 1);
+               char *v = ast_strip_quoted(val.ues[i], "'", "'");
+               value = ast_calloc(sizeof(char), sizeof(*value) + strlen(v));
                if (!value) {
-                       ast_log(LOG_ERROR, "Out of memory creating entry for value '%s'\n", val);
+                       ast_log(LOG_ERROR, "Out of memory creating entry for value '%s'\n", v);
                        ast_free(save);
                        return -1;
                }
-               value->expression = (char *) value + sizeof(*value);
-               ast_copy_string(value->expression, val, strlen(val) + 1);
+               strcpy(value->expression, v); /* SAFE */
                AST_LIST_INSERT_TAIL(&sql_values, value, list);
        }
        ast_free(save);