git-svn: trunk@2248
Tomasz Kojm authored on 2006/09/13 07:52:01... | ... |
@@ -1,3 +1,7 @@ |
1 |
+Wed Sep 13 00:50:40 CEST 2006 (tk) |
|
2 |
+---------------------------------- |
|
3 |
+ * shared/cfgparser.c: fix error path leaks, patch from Mark Pizzolato |
|
4 |
+ |
|
1 | 5 |
Wed Sep 13 00:35:57 CEST 2006 (tk) |
2 | 6 |
---------------------------------- |
3 | 7 |
* configure: add -lresolv to CLAMAV_MILTER_LIBS, patch from Stephen Gran |
... | ... |
@@ -169,12 +169,15 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) |
169 | 169 |
if(verbose) |
170 | 170 |
fprintf(stderr, "ERROR: Parse error at line %d: Option %s requires string argument.\n", line, name); |
171 | 171 |
fclose(fs); |
172 |
+ free(name); |
|
172 | 173 |
freecfg(copt); |
173 | 174 |
return NULL; |
174 | 175 |
} |
175 | 176 |
if(regcfg(&copt, name, arg, -1, pt->multiple) < 0) { |
176 | 177 |
fprintf(stderr, "ERROR: Can't register new options (not enough memory)\n"); |
177 | 178 |
fclose(fs); |
179 |
+ free(name); |
|
180 |
+ free(arg); |
|
178 | 181 |
freecfg(copt); |
179 | 182 |
return NULL; |
180 | 183 |
} |
... | ... |
@@ -185,17 +188,20 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) |
185 | 185 |
if(verbose) |
186 | 186 |
fprintf(stderr, "ERROR: Parse error at line %d: Option %s requires string argument.\n", line, name); |
187 | 187 |
fclose(fs); |
188 |
+ free(name); |
|
188 | 189 |
freecfg(copt); |
189 | 190 |
return NULL; |
190 | 191 |
} |
191 | 192 |
free(arg); |
192 | 193 |
arg = strstr(buff, " "); |
193 | 194 |
arg = strdup(++arg); |
194 |
- if((c = strpbrk(arg, "\n\r"))) |
|
195 |
+ if((arg) && (c = strpbrk(arg, "\n\r"))) |
|
195 | 196 |
*c = '\0'; |
196 |
- if(regcfg(&copt, name, arg, -1, pt->multiple) < 0) { |
|
197 |
+ if((!arg) || (regcfg(&copt, name, arg, -1, pt->multiple) < 0)) { |
|
197 | 198 |
fprintf(stderr, "ERROR: Can't register new options (not enough memory)\n"); |
198 | 199 |
fclose(fs); |
200 |
+ free(name); |
|
201 |
+ free(arg); |
|
199 | 202 |
freecfg(copt); |
200 | 203 |
return NULL; |
201 | 204 |
} |
... | ... |
@@ -205,14 +211,17 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) |
205 | 205 |
if(verbose) |
206 | 206 |
fprintf(stderr, "ERROR: Parse error at line %d: Option %s requires numerical argument.\n", line, name); |
207 | 207 |
fclose(fs); |
208 |
+ free(name); |
|
209 |
+ free(arg); |
|
208 | 210 |
freecfg(copt); |
209 | 211 |
return NULL; |
210 | 212 |
} |
211 | 213 |
if(regcfg(&copt, name, NULL, atoi(arg), pt->multiple) < 0) { |
212 | 214 |
fprintf(stderr, "ERROR: Can't register new options (not enough memory)\n"); |
213 | 215 |
fclose(fs); |
214 |
- freecfg(copt); |
|
216 |
+ free(name); |
|
215 | 217 |
free(arg); |
218 |
+ freecfg(copt); |
|
216 | 219 |
return NULL; |
217 | 220 |
} |
218 | 221 |
free(arg); |
... | ... |
@@ -222,6 +231,7 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) |
222 | 222 |
if(verbose) |
223 | 223 |
fprintf(stderr, "ERROR: Parse error at line %d: Option %s requires argument.\n", line, name); |
224 | 224 |
fclose(fs); |
225 |
+ free(name); |
|
225 | 226 |
freecfg(copt); |
226 | 227 |
return NULL; |
227 | 228 |
} |
... | ... |
@@ -233,6 +243,8 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) |
233 | 233 |
if(verbose) |
234 | 234 |
fprintf(stderr, "ERROR: Parse error at line %d: Option %s requires numerical (raw/K/M) argument.\n", line, name); |
235 | 235 |
fclose(fs); |
236 |
+ free(name); |
|
237 |
+ free(arg); |
|
236 | 238 |
freecfg(copt); |
237 | 239 |
return NULL; |
238 | 240 |
} |
... | ... |
@@ -246,6 +258,8 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) |
246 | 246 |
if(verbose) |
247 | 247 |
fprintf(stderr, "ERROR: Parse error at line %d: Option %s requires numerical (raw/K/M) argument.\n", line, name); |
248 | 248 |
fclose(fs); |
249 |
+ free(name); |
|
250 |
+ free(arg); |
|
249 | 251 |
freecfg(copt); |
250 | 252 |
return NULL; |
251 | 253 |
} |
... | ... |
@@ -255,6 +269,8 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) |
255 | 255 |
if(regcfg(&copt, name, NULL, calc, pt->multiple) < 0) { |
256 | 256 |
fprintf(stderr, "ERROR: Can't register new options (not enough memory)\n"); |
257 | 257 |
fclose(fs); |
258 |
+ free(name); |
|
259 |
+ free(arg); |
|
258 | 260 |
freecfg(copt); |
259 | 261 |
return NULL; |
260 | 262 |
} |
... | ... |
@@ -265,6 +281,7 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) |
265 | 265 |
if(verbose) |
266 | 266 |
fprintf(stderr, "ERROR: Parse error at line %d: Option %s requires boolean argument.\n", line, name); |
267 | 267 |
fclose(fs); |
268 |
+ free(name); |
|
268 | 269 |
freecfg(copt); |
269 | 270 |
return NULL; |
270 | 271 |
} |
... | ... |
@@ -277,6 +294,8 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) |
277 | 277 |
if(verbose) |
278 | 278 |
fprintf(stderr, "ERROR: Parse error at line %d: Option %s requires boolean argument.\n", line, name); |
279 | 279 |
fclose(fs); |
280 |
+ free(name); |
|
281 |
+ free(arg); |
|
280 | 282 |
freecfg(copt); |
281 | 283 |
return NULL; |
282 | 284 |
} |
... | ... |
@@ -284,6 +303,8 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) |
284 | 284 |
if(regcfg(&copt, name, NULL, val, pt->multiple) < 0) { |
285 | 285 |
fprintf(stderr, "ERROR: Can't register new options (not enough memory)\n"); |
286 | 286 |
fclose(fs); |
287 |
+ free(name); |
|
288 |
+ free(arg); |
|
287 | 289 |
freecfg(copt); |
288 | 290 |
return NULL; |
289 | 291 |
} |
... | ... |
@@ -291,6 +312,7 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) |
291 | 291 |
default: |
292 | 292 |
if(verbose) |
293 | 293 |
fprintf(stderr, "ERROR: Parse error at line %d: Option %s is of unknown type %d\n", line, name, pt->argtype); |
294 |
+ fclose(fs); |
|
294 | 295 |
free(name); |
295 | 296 |
free(arg); |
296 | 297 |
freecfg(copt); |
... | ... |
@@ -304,6 +326,7 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) |
304 | 304 |
if(!found) { |
305 | 305 |
if(verbose) |
306 | 306 |
fprintf(stderr, "ERROR: Parse error at line %d: Unknown option %s.\n", line, name); |
307 |
+ free(name); |
|
307 | 308 |
fclose(fs); |
308 | 309 |
freecfg(copt); |
309 | 310 |
return NULL; |