Browse code

fix error path leaks

git-svn: trunk@2248

Tomasz Kojm authored on 2006/09/13 07:52:01
Showing 2 changed files
... ...
@@ -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;