... | ... |
@@ -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 |
} |