Browse code

use INSTREAM in clamav-milter

aCaB authored on 2009/06/29 23:46:44
Showing 3 changed files
... ...
@@ -1,3 +1,7 @@
1
+Mon Jun 29 15:40:42 CEST 2009 (acab)
2
+------------------------------------
3
+ * clamav-milter: use s/STREAM/INSTREAM/ (bb#1548)
4
+
1 5
 Mon Jun 29 11:25:46 CEST 2009 (acab)
2 6
 ------------------------------------
3 7
  * clamav-milter/netcode.c: Properly handle clamd disconnection (bb#1643)
... ...
@@ -64,7 +64,6 @@ enum {
64 64
 static const char *HDR_UNAVAIL = "UNKNOWN";
65 65
 
66 66
 struct CLAMFI {
67
-    char buffer[CLAMFIBUFSZ];
68 67
     const char *virusname;
69 68
     char *msg_subj;
70 69
     char *msg_date;
... ...
@@ -78,6 +77,8 @@ struct CLAMFI {
78 78
     unsigned int gotbody;
79 79
     unsigned int scanned_count;
80 80
     unsigned int status_count;
81
+    uint32_t sendme;
82
+    char buffer[CLAMFIBUFSZ];
81 83
 };
82 84
 
83 85
 
... ...
@@ -175,18 +176,21 @@ static sfsistat sendchunk(struct CLAMFI *cf, unsigned char *bodyp, size_t len, S
175 175
 	    cf->bufsz += len;
176 176
 	} else if(len < CLAMFIBUFSZ) {
177 177
 	    memcpy(&cf->buffer[cf->bufsz], bodyp, CLAMFIBUFSZ - cf->bufsz);
178
-	    sendfailed = nc_send(cf->alt, cf->buffer, CLAMFIBUFSZ);
178
+	    cf->sendme = htonl(CLAMFIBUFSZ);
179
+	    sendfailed = nc_send(cf->main, &cf->sendme, CLAMFIBUFSZ + 4);
179 180
 	    len -= (CLAMFIBUFSZ - cf->bufsz);
180 181
 	    memcpy(cf->buffer, &bodyp[CLAMFIBUFSZ - cf->bufsz], len);
181 182
 	    cf->bufsz = len;
182 183
 	} else {
183
-	    if(nc_send(cf->alt, cf->buffer, cf->bufsz) || nc_send(cf->alt, bodyp, len))
184
+	    uint32_t sendmetoo = htonl(len);
185
+	    cf->sendme = htonl(cf->bufsz);
186
+	    if((cf->bufsz && nc_send(cf->main, &cf->sendme, cf->bufsz + 4)) || nc_send(cf->main, &sendmetoo, 4) || nc_send(cf->main, bodyp, len))
184 187
 		sendfailed = 1;
185 188
 	    cf->bufsz = 0;
186 189
 	}
187 190
 	if(sendfailed) {
188 191
 	    logg("!Streaming failed\n");
189
-	    nullify(ctx, cf, CF_MAIN);
192
+	    nullify(ctx, cf, CF_NONE);
190 193
 	    return FailAction;
191 194
 	}
192 195
     }
... ...
@@ -289,12 +293,13 @@ sfsistat clamfi_eom(SMFICTX *ctx) {
289 289
 	    return FailAction;
290 290
 	}
291 291
     } else {
292
-	if(cf->bufsz && nc_send(cf->alt, cf->buffer, cf->bufsz)) {
292
+	uint32_t sendmetoo = 0;
293
+	cf->sendme = htonl(cf->bufsz);
294
+	if((cf->bufsz && nc_send(cf->main, &cf->sendme, cf->bufsz + 4)) || nc_send(cf->main, &sendmetoo, 4))  {
293 295
 	    logg("!Failed to flush STREAM\n");
294
-	    nullify(ctx, cf, CF_MAIN);
296
+	    nullify(ctx, cf, CF_NONE);
295 297
 	    return FailAction;
296 298
 	}
297
-	close(cf->alt);
298 299
     }
299 300
 
300 301
     reply = nc_recv(cf->main);
... ...
@@ -315,41 +315,8 @@ int nc_connect_rand(int *main, int *alt, int *local) {
315 315
 	unlink(unlinkme);
316 316
 	free(unlinkme);
317 317
     } else {
318
-	char *reply=NULL, *port;
319
-	int nport;
320
-	struct CP_ENTRY new_cpe;
321
-	union {
322
-	    struct sockaddr_in sa4;
323
-	    struct sockaddr_in6 sa6;
324
-	} sa;
325
-
326
-	if(nc_send(*main, "nSTREAM\n", 8) || !(reply = nc_recv(*main)) || !(port = strstr(reply, "PORT"))) {
318
+	if(nc_send(*main, "nINSTREAM\n", 10)) {
327 319
 	    logg("!Failed to communicate with clamd\n");
328
-	    if(reply) {
329
-		free(reply);
330
-		close(*main);
331
-	    }
332
-	    return 1;
333
-	}
334
-	port+=5;
335
-	sscanf(port, "%d", &nport);
336
-	free(reply);
337
-	if(cpe->server->sa_family == AF_INET && cpe->socklen == sizeof(struct sockaddr_in)) {
338
-	    memcpy(&sa, cpe->server, sizeof(struct sockaddr_in));
339
-	    sa.sa4.sin_port = htons(nport);
340
-	    new_cpe.socklen = sizeof(struct sockaddr_in);
341
-	} else if(cpe->server->sa_family == AF_INET6 && cpe->socklen == sizeof(struct sockaddr_in6)) {
342
-	    memcpy(&sa, cpe->server, sizeof(struct sockaddr_in6));
343
-	    sa.sa6.sin6_port = htons(nport);
344
-	    new_cpe.socklen = sizeof(struct sockaddr_in6);
345
-	} else {
346
-	    logg("!WTF WHY AM I DOING HERE???\n");
347
-	    close(*main);
348
-	    return 1;
349
-	}
350
-	new_cpe.server = (struct sockaddr *)&sa;
351
-	if ((*alt = nc_connect_entry(&new_cpe)) == -1) {
352
-	    logg("!Failed to communicate with clamd for streaming\n");
353 320
 	    close(*main);
354 321
 	    return 1;
355 322
 	}