Browse code

bb#11029 - fixed memory leaks in clamav-milter

Kevin Lin authored on 2014/06/10 01:50:16
Showing 1 changed files
... ...
@@ -228,7 +228,7 @@ sfsistat clamfi_header(SMFICTX *ctx, char *headerf, char *headerv) {
228 228
     if(!cf->totsz && cf->all_whitelisted) {
229 229
 	logg("*Skipping scan (all destinations whitelisted)\n");
230 230
 	nullify(ctx, cf, CF_NONE);
231
-    free(cf);
231
+	free(cf);
232 232
 	return SMFIS_ACCEPT;
233 233
     }
234 234
 
... ...
@@ -260,32 +260,43 @@ sfsistat clamfi_header(SMFICTX *ctx, char *headerf, char *headerv) {
260 260
         free(cf);
261 261
         return ret;
262 262
     }
263
-    return sendchunk(cf, (unsigned char *)"\r\n", 2, ctx);
263
+    ret = sendchunk(cf, (unsigned char *)"\r\n", 2, ctx);
264
+    if(ret != SMFIS_CONTINUE)
265
+        free(cf);
266
+    return ret;
264 267
 }
265 268
 
266 269
 
267 270
 sfsistat clamfi_body(SMFICTX *ctx, unsigned char *bodyp, size_t len) {
268 271
     struct CLAMFI *cf;
272
+    sfsistat ret;
269 273
 
270 274
     if(!(cf = (struct CLAMFI *)smfi_getpriv(ctx)))
271 275
 	return SMFIS_CONTINUE; /* whatever */
272 276
 
273 277
     if(!cf->gotbody) {
274
-	sfsistat ret = sendchunk(cf, (unsigned char *)"\r\n", 2, ctx);
275
-	if(ret != SMFIS_CONTINUE)
278
+	ret = sendchunk(cf, (unsigned char *)"\r\n", 2, ctx);
279
+	if(ret != SMFIS_CONTINUE) {
280
+	    free(cf);
276 281
 	    return ret;
282
+        }
277 283
 	cf->gotbody = 1;
278 284
     }
279 285
 
280
-    return sendchunk(cf, bodyp, len, ctx);
286
+    ret = sendchunk(cf, bodyp, len, ctx);
287
+    if(ret != SMFIS_CONTINUE)
288
+	free(cf);
289
+    return ret;
281 290
 }
282 291
 
283 292
 
284 293
 sfsistat clamfi_abort(SMFICTX *ctx) {
285 294
     struct CLAMFI *cf;
286 295
 
287
-    if((cf = (struct CLAMFI *)smfi_getpriv(ctx)))
296
+    if((cf = (struct CLAMFI *)smfi_getpriv(ctx))) {
288 297
 	nullify(ctx, cf, CF_ANY);
298
+	free(cf);
299
+    }
289 300
     return SMFIS_CONTINUE;
290 301
 }
291 302
 
... ...
@@ -303,6 +314,7 @@ sfsistat clamfi_eom(SMFICTX *ctx) {
303 303
 	logg("*Not scanning an empty message\n");
304 304
 	ret = CleanAction(ctx);
305 305
 	nullify(ctx, cf, CF_NONE);
306
+	free(cf);
306 307
 	return ret;
307 308
     }
308 309
 
... ...
@@ -312,6 +324,7 @@ sfsistat clamfi_eom(SMFICTX *ctx) {
312 312
 	if(nc_sendmsg(cf->main, cf->alt) == -1) {
313 313
 	    logg("!FD send failed\n");
314 314
 	    nullify(ctx, cf, CF_ALT);
315
+	    free(cf);
315 316
 	    return FailAction;
316 317
 	}
317 318
     } else {
... ...
@@ -320,6 +333,7 @@ sfsistat clamfi_eom(SMFICTX *ctx) {
320 320
 	if((cf->bufsz && nc_send(cf->main, &cf->sendme, cf->bufsz + 4)) || nc_send(cf->main, &sendmetoo, 4))  {
321 321
 	    logg("!Failed to flush STREAM\n");
322 322
 	    nullify(ctx, cf, CF_NONE);
323
+	    free(cf);
323 324
 	    return FailAction;
324 325
 	}
325 326
     }
... ...
@@ -334,6 +348,7 @@ sfsistat clamfi_eom(SMFICTX *ctx) {
334 334
     if(!reply) {
335 335
 	logg("!No reply from clamd\n");
336 336
 	nullify(ctx, cf, CF_NONE);
337
+	free(cf);
337 338
 	return FailAction;
338 339
     }
339 340
 
... ...
@@ -468,7 +483,7 @@ sfsistat clamfi_eom(SMFICTX *ctx) {
468 468
     }
469 469
 
470 470
     nullify(ctx, cf, CF_MAIN);
471
-
471
+    free(cf);
472 472
     free(reply);
473 473
     return ret;
474 474
 }
... ...
@@ -729,6 +744,7 @@ sfsistat clamfi_envrcpt(SMFICTX *ctx, char **argv) {
729 729
 	if(!new_rcpt) {
730 730
 	    logg("!Failed to allocate array for new recipient\n");
731 731
 	    nullify(ctx, cf, CF_ANY);
732
+	    free(cf);
732 733
 	    return FailAction;
733 734
 	}
734 735
 	cf->recipients = new_rcpt;
... ...
@@ -736,6 +752,7 @@ sfsistat clamfi_envrcpt(SMFICTX *ctx, char **argv) {
736 736
 	if(!(cf->recipients[rcpt_cnt] = strdup(argv[0]))) {
737 737
 	    logg("!Failed to allocate space for new recipient\n");
738 738
 	    nullify(ctx, cf, CF_ANY);
739
+	    free(cf);
739 740
 	    return FailAction;
740 741
 	}
741 742
     }