git-svn: trunk@4940
Török Edvin authored on 2009/03/13 22:50:56... | ... |
@@ -1,3 +1,8 @@ |
1 |
+Fri Mar 13 15:50:51 EET 2009 (edwin) |
|
2 |
+------------------------------------ |
|
3 |
+ * clamd/scanner.c, clamd/session.c: stop scanning when client |
|
4 |
+ disconnects (bb #1446). |
|
5 |
+ |
|
1 | 6 |
Fri Mar 13 13:21:36 CET 2009 (tk) |
2 | 7 |
--------------------------------- |
3 | 8 |
* sigtool/sigtool.c: fix quirks with .cdiff generation (bb#1395) |
... | ... |
@@ -88,6 +88,19 @@ int scan_callback(struct stat *sb, char *filename, const char *msg, enum cli_ftw |
88 | 88 |
int type = scandata->type; |
89 | 89 |
const struct optstruct *opt; |
90 | 90 |
|
91 |
+ fd_set rfds; |
|
92 |
+ struct timeval tv; |
|
93 |
+ |
|
94 |
+ FD_ZERO(&rfds); |
|
95 |
+ FD_SET(scandata->conn->sd, &rfds); |
|
96 |
+ tv.tv_sec = tv.tv_usec = 0; |
|
97 |
+ if (select(scandata->conn->sd+1, &rfds, NULL, NULL, &tv) > 0 && |
|
98 |
+ FD_ISSET(scandata->conn->sd, &rfds)) { |
|
99 |
+ logg("$Client disconnected while command was active!\n"); |
|
100 |
+ thrmgr_group_terminate(scandata->conn->group); |
|
101 |
+ return CL_BREAK; |
|
102 |
+ } |
|
103 |
+ |
|
91 | 104 |
if (thrmgr_group_need_terminate(scandata->conn->group)) { |
92 | 105 |
logg("^Client disconnected while scanjob was active\n"); |
93 | 106 |
if (reason == visit_file) |
... | ... |
@@ -230,29 +230,18 @@ int command(client_conn_t *conn, int *virus) |
230 | 230 |
scandata.group = group = thrmgr_group_new(); |
231 | 231 |
break; |
232 | 232 |
case COMMAND_MULTISCANFILE: |
233 |
- { |
|
234 |
- fd_set rfds; |
|
235 |
- struct timeval tv; |
|
236 |
- |
|
237 |
- FD_ZERO(&rfds); |
|
238 |
- FD_SET(conn->sd, &rfds); |
|
239 |
- tv.tv_sec = tv.tv_usec = 0; |
|
240 |
- if (select(conn->sd+1, &rfds, NULL, NULL, &tv) > 0 && |
|
241 |
- FD_ISSET(conn->sd, &rfds)) { |
|
242 |
- logg("$Client disconnected while multiscan was active!\n"); |
|
243 |
- thrmgr_group_terminate(conn->group); |
|
244 |
- return CL_BREAK; |
|
245 |
- } |
|
246 |
- } |
|
247 | 233 |
thrmgr_setactivetask(NULL, "MULTISCANFILE"); |
248 | 234 |
scandata.group = NULL; |
249 | 235 |
scandata.type = TYPE_SCAN; |
250 | 236 |
scandata.thr_pool = NULL; |
251 | 237 |
/* TODO: check ret value */ |
252 |
- scan_callback(NULL, conn->filename, conn->filename, visit_file, &data); |
|
253 |
- /* callback freed it */ |
|
238 |
+ ret = scan_callback(NULL, conn->filename, conn->filename, visit_file, &data); /* callback freed it */ |
|
254 | 239 |
conn->filename = NULL; |
255 | 240 |
*virus = scandata.infected; |
241 |
+ if (ret == CL_BREAK) { |
|
242 |
+ thrmgr_group_terminate(conn->group); |
|
243 |
+ return CL_BREAK; |
|
244 |
+ } |
|
256 | 245 |
return scandata.errors > 0 ? scandata.errors : 0; |
257 | 246 |
case COMMAND_FILDES: |
258 | 247 |
thrmgr_setactivetask(NULL, "FILDES"); |