izmjene licence
[ossec-hids.git] / src / os_xml / os_xml_variables.c
1 /*   $OSSEC, os_xml_node_variables.c, v0.3, 2005/04/12, Daniel B. Cid$   */
2
3 /* Copyright (C) 2009 Trend Micro Inc.
4  * All rights reserved.
5  *
6  * This program is a free software; you can redistribute it
7  * and/or modify it under the terms of the GNU General Public
8  * License (version 2) as published by the FSF - Free Software
9  * Foundation
10  */
11
12 /* os_xml C Library.
13  * Available at http://www.ossec.net/
14  */
15
16
17 #include <stdio.h>
18 #include <string.h>
19 #include <stdlib.h>
20
21 #include "os_xml.h"
22 #include "os_xml_internal.h"
23
24 int OS_ApplyVariables(OS_XML *_lxml)
25 {
26     unsigned int i, j = 0, s = 0;
27     int retval = 0;
28     char **var = NULL;
29     char **value = NULL;
30     char **tmp = NULL;
31     char *p2= NULL;
32     char *var_placeh = NULL;
33
34
35     /* Getting all variables */
36     for(i = 0;i<_lxml->cur;i++)
37     {
38         if(_lxml->tp[i] == XML_VARIABLE_BEGIN)
39         {
40             int _found_var = 0;
41
42             for(j = i + 1;j<_lxml->cur;j++)
43             {
44                 if(_lxml->rl[j] < _lxml->rl[i])
45                     break;
46
47                 else if(_lxml->tp[j] == XML_ATTR)
48                 {
49                     if((_lxml->el[j])&&(strcasecmp(_lxml->el[j],XML_VAR_ATTRIBUTE) == 0))
50                     {
51                         if(!_lxml->ct[j])
52                         {
53                             snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Invalid variable content.");
54                             _lxml->err_line = _lxml->ln[j];
55                             goto fail;
56                         }
57                         else if(strlen(_lxml->ct[j]) >= XML_VARIABLE_MAXSIZE)
58                         {
59                             snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Invalid variable name size.");
60                             _lxml->err_line = _lxml->ln[j];
61                             goto fail;
62                         }
63
64                         /* If not used, it will be cleaned latter */
65                         snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Memory error.");
66
67                         tmp = (char**)realloc(var,(s+1)*sizeof(char *));
68                         if(tmp == NULL)
69                             goto fail;
70                         var = tmp;
71
72                         var[s] = _lxml->ct[j];
73
74                         /* Cleaning the lxml->err */
75                         strncpy(_lxml->err," ", 3);
76
77                         _found_var = 1;
78                         break;
79                     }
80                     else
81                     {
82                         snprintf(_lxml->err, XML_ERR_LENGTH,
83                                  "XMLERR: Only \""XML_VAR_ATTRIBUTE"\" is allowed"
84                                  " as an attribute for a variable.");
85                         _lxml->err_line = _lxml->ln[j];
86                         goto fail;
87                     }
88                 }
89             } /* Attribute FOR */
90
91
92             if((_found_var == 0)||(!_lxml->ct[i]))
93             {
94                 snprintf(_lxml->err,XML_ERR_LENGTH,
95                          "XMLERR: No value set for variable.");
96                 _lxml->err_line = _lxml->ln[i];
97                 goto fail;
98             }
99
100
101             snprintf(_lxml->err,XML_ERR_LENGTH, "XMLERR: Memory error.");
102
103             tmp = (char**)realloc(value,(s+1)*sizeof(char *));
104             if (tmp == NULL)
105                 goto fail;
106             value = tmp;
107
108             value[s] = _lxml->ct[i];
109
110             strncpy(_lxml->err," ", 3);
111             s++;
112         }
113         else if(((_lxml->tp[i] == XML_ELEM) || (_lxml->tp[i] == XML_ATTR))&&
114             (_lxml->ct[i]))
115         {
116             unsigned int tp = 0;
117             size_t init = 0;
118             char *p = NULL;
119             char lvar[XML_VARIABLE_MAXSIZE]; /* MAX Var size */
120
121
122             if(strlen(_lxml->ct[i]) <= 2)
123                 continue;
124
125
126             /* Duplicating string */
127             p = strdup(_lxml->ct[i]);
128             p2= p;
129
130             if(p == NULL)
131             {
132                 snprintf(_lxml->err, XML_ERR_LENGTH, "XMLERR: Memory error.");
133                 goto fail;
134             }
135
136
137             /* Reading the whole string */
138             while(*p != '\0')
139             {
140                 if(*p == XML_VARIABLE_BEGIN)
141                 {
142                     tp = 0;
143                     p++;
144                     memset(lvar, '\0', XML_VARIABLE_MAXSIZE);
145
146                     while(1)
147                     {
148                         if((*p == XML_VARIABLE_BEGIN)
149                             ||(*p == '\0')
150                             ||(*p == '.')
151                             ||(*p == '|')
152                             ||(*p == ',')
153                             ||(*p == ' '))
154                         {
155                             lvar[tp]='\0';
156
157                             /* Looking for var */
158                             for(j=0; j<s; j++)
159                             {
160                                 if(var[j] == NULL)
161                                     break;
162
163                                 if(strcasecmp(var[j], lvar) != 0)
164                                 {
165                                     continue;
166                                 }
167
168
169                                 size_t tsize = strlen(_lxml->ct[i]) +
170                                         strlen(value[j]) - tp + 1;
171
172                                 var_placeh = strdup(_lxml->ct[i]);
173
174                                 free(_lxml->ct[i]);
175
176                                 _lxml->ct[i] = (char*)calloc(tsize +2,
177                                                              sizeof(char));
178
179                                 if(_lxml->ct[i] == NULL || var_placeh == NULL)
180                                 {
181                                     snprintf(_lxml->err,XML_ERR_LENGTH, "XMLERR: Memory "
182                                                              "error.");
183                                     goto fail;
184                                 }
185
186
187                                 strncpy(_lxml->ct[i], var_placeh, tsize);
188
189
190                                 _lxml->ct[i][init] = '\0';
191                                 strncat(_lxml->ct[i], value[j],tsize - init);
192
193
194                                 init = strlen(_lxml->ct[i]);
195                                 strncat(_lxml->ct[i], p,
196                                          tsize - strlen(_lxml->ct[i]));
197
198
199                                 free(var_placeh);
200                                 var_placeh = NULL;
201
202                                 break;
203                             }
204
205                             /* Variale not found */
206                             if((j == s) && (strlen(lvar) >= 1))
207                             {
208                                 snprintf(_lxml->err,XML_ERR_LENGTH,
209                                                 "XMLERR: Unknown variable"
210                                                 ": '%s'.", lvar);
211                                 _lxml->err_line = _lxml->ln[i];
212                                 goto fail;
213                             }
214                             else if(j == s)
215                             {
216                                 init++;
217                             }
218
219                             goto go_next;
220                         }
221
222                         /* Maximum size for a variable */
223                         if(tp >= XML_VARIABLE_MAXSIZE - 1)
224                         {
225                             snprintf(_lxml->err,XML_ERR_LENGTH, "XMLERR: Invalid "
226                                                      "variable name size: '%u'.", tp);
227                             _lxml->err_line = _lxml->ln[i];
228                             goto fail;
229
230                         }
231
232                         lvar[tp] = *p;
233                         tp++;
234                         p++;
235                     }
236                 } /* IF XML_VAR_BEGIN */
237
238                 p++;
239                 init++;
240
241                 go_next:
242                 continue;
243
244             } /* WHILE END */
245
246             if(p2 != NULL)
247             {
248                 free(p2);
249                 p2 = NULL;
250                 p = NULL;
251             }
252         }
253     }
254
255     goto cleanup;
256
257     fail:
258     retval = -1;
259
260     cleanup:
261     /* Cleaning the variables */
262     free(var);
263     free(value);
264     free(p2);
265         free(var_placeh);
266
267     return(retval);
268 }
269
270 /* UFA :) or EOF */