Browse code

stop scanning when client disconnects (bb #1446).

git-svn: trunk@4940

Török Edvin authored on 2009/03/13 22:50:56
Showing 3 changed files
... ...
@@ -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");