Fix some uninitialized buffers for CDR handling valgrind found.
authorRichard Mudgett <rmudgett@digium.com>
Wed, 28 Aug 2013 23:15:43 +0000 (23:15 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Wed, 28 Aug 2013 23:15:43 +0000 (23:15 +0000)
* Made ast_strftime_locale() ensure that the output buffer is initialized.
The std library strftime() returns 0 and does not touch the buffer if it
has an error.  However, the function can also return 0 without an error.

(closes issue ASTERISK-22412)
Reported by: rmudgett
........

Merged revisions 397902 from http://svn.asterisk.org/svn/asterisk/branches/12

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

funcs/func_cdr.c
main/cdr.c
main/stdtime/localtime.c

index 9c78511..6d9fb19 100644 (file)
@@ -213,6 +213,8 @@ static int cdr_read(struct ast_channel *chan, const char *cmd, char *parse,
                AST_APP_ARG(options);
        );
 
+       buf[0] = '\0';/* Ensure the buffer is initialized. */
+
        if (!chan) {
                return -1;
        }
index d0e52e7..53336c8 100644 (file)
@@ -2764,6 +2764,7 @@ static void cdr_get_tv(struct timeval when, const char *fmt, char *buf, int bufs
        if (fmt == NULL) {      /* raw mode */
                snprintf(buf, bufsize, "%ld.%06ld", (long)when.tv_sec, (long)when.tv_usec);
        } else {
+               buf[0] = '\0';/* Ensure the buffer is initialized. */
                if (when.tv_sec) {
                        struct ast_tm tm;
 
@@ -3083,8 +3084,6 @@ int ast_cdr_serialize_variables(const char *channel_name, struct ast_str **buf,
                }
 
                for (i = 0; cdr_readonly_vars[i]; i++) {
-                       /* null out the workspace, because the cdr_get_tv() won't write anything if time is NULL, so you get old vals */
-                       workspace[0] = 0;
                        if (cdr_object_format_property(it_cdr, cdr_readonly_vars[i], workspace, sizeof(workspace))) {
                                /* Unhandled read-only CDR variable. */
                                ast_assert(0);
@@ -3638,7 +3637,7 @@ static void cli_show_channels(struct ast_cli_args *a)
        struct ao2_iterator it_cdrs;
        struct cdr_object *cdr;
        char start_time_buffer[64];
-       char answer_time_buffer[64] = "\0";
+       char answer_time_buffer[64];
        char end_time_buffer[64];
 
 #define TITLE_STRING "%-25.25s %-25.25s %-15.15s %-8.8s %-8.8s %-8.8s %-8.8s %-8.8s\n"
@@ -3702,8 +3701,8 @@ static void cli_show_channel(struct ast_cli_args *a)
        struct cdr_object *it_cdr;
        char clid[64];
        char start_time_buffer[64];
-       char answer_time_buffer[64] = "\0";
-       char end_time_buffer[64] = "\0";
+       char answer_time_buffer[64];
+       char end_time_buffer[64];
        const char *channel_name = a->argv[3];
        RAII_VAR(struct cdr_object *, cdr, NULL, ao2_cleanup);
 
index f7b4bd0..5ca43b8 100644 (file)
@@ -2304,6 +2304,7 @@ int ast_strftime_locale(char *buf, size_t len, const char *tmp, const struct ast
        long fraction;
        const char *prevlocale;
 
+       buf[0] = '\0';/* Ensure the buffer is initialized. */
        if (!format) {
                return -1;
        }