ensure variable structure is initialized before use (issue #5092)
[asterisk/asterisk.git] / chanvars.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Channel Variables
5  * 
6  * Copyright (C) 2002, Mark Spencer
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 #include <stdlib.h>
15 #include <string.h>
16
17 #include "asterisk.h"
18
19 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
20
21 #include "asterisk/chanvars.h"
22 #include "asterisk/logger.h"
23
24 struct ast_var_t *ast_var_assign(const char *name, const char *value)
25 {
26         int i;
27         struct ast_var_t *var;
28         int len;
29         
30         len = sizeof(struct ast_var_t);
31         
32         len += strlen(name) + 1;
33         len += strlen(value) + 1;
34         
35         var = malloc(len);
36
37         if (var == NULL)
38         {
39                 ast_log(LOG_WARNING, "Out of memory\n");
40                 return NULL;
41         }
42         
43         memset(var, 0, len);
44         i = strlen(name);
45         strncpy(var->name, name, i); 
46         var->name[i] = '\0';
47
48         var->value = var->name + i + 1;
49
50         i = strlen(value);
51         strncpy(var->value, value, i);
52         var->value[i] = '\0';
53         
54         return var;
55 }       
56         
57 void ast_var_delete(struct ast_var_t *var)
58 {
59         if (var == NULL) return;
60         free(var);
61 }
62
63 char *ast_var_name(struct ast_var_t *var)
64 {
65         char *name;
66
67         if (var == NULL)
68                 return NULL;
69         if (var->name == NULL)
70                 return NULL;
71         /* Return the name without the initial underscores */
72         if ((strlen(var->name) > 0) && (var->name[0] == '_')) {
73                 if ((strlen(var->name) > 1) && (var->name[1] == '_'))
74                         name = (char*)&(var->name[2]);
75                 else
76                         name = (char*)&(var->name[1]);
77         } else
78                 name = var->name;
79         return name;
80 }
81
82 char *ast_var_full_name(struct ast_var_t *var)
83 {
84         return (var != NULL ? var->name : NULL);
85 }
86
87 char *ast_var_value(struct ast_var_t *var)
88 {
89         return (var != NULL ? var->value : NULL);
90 }
91
92