Browse code

Scan_all: virus alert handling improvements

David Raynor authored on 2013/06/12 06:06:41
Showing 2 changed files
... ...
@@ -106,7 +106,7 @@ void hash_callback(int fd, unsigned long long size, const unsigned char *md5, co
106 106
 int scan_callback(STATBUF *sb, char *filename, const char *msg, enum cli_ftw_reason reason, struct cli_ftw_cbdata *data)
107 107
 {
108 108
     struct scan_cb_data *scandata = data->data;
109
-    const char *virname;
109
+    const char *virname = NULL;
110 110
     const char **virpp = &virname;
111 111
     int ret;
112 112
     int type = scandata->type;
... ...
@@ -233,7 +233,7 @@ int scan_callback(STATBUF *sb, char *filename, const char *msg, enum cli_ftw_rea
233 233
 
234 234
     if (scandata->options & CL_SCAN_ALLMATCHES) {
235 235
 	virpp = (const char **)*virpp; /* temp hack for scanall mode until api augmentation */
236
-	virname = virpp[0];
236
+	if (virpp) virname = virpp[0];
237 237
     }
238 238
 
239 239
     if (thrmgr_group_need_terminate(scandata->conn->group)) {
... ...
@@ -244,6 +244,11 @@ int scan_callback(STATBUF *sb, char *filename, const char *msg, enum cli_ftw_rea
244 244
 	return ret == CL_ETIMEOUT ? ret : CL_BREAK;
245 245
     }
246 246
 
247
+    if ((ret == CL_VIRUS) && (virname == NULL)) {
248
+        logg("*%s: reported infected but no virname returned!\n", filename);
249
+        ret = CL_EMEM;
250
+    }
251
+
247 252
     if (ret == CL_VIRUS) {
248 253
 	scandata->infected++;
249 254
 	if (conn_reply_virus(scandata->conn, filename, virname) == -1) {
... ...
@@ -841,17 +841,19 @@ void cli_append_virus(cli_ctx * ctx, const char * virname)
841 841
 	return;
842 842
     if (SCAN_ALL) {
843 843
 	if (ctx->size_viruses == 0) {
844
-	    ctx->size_viruses = 2;
845 844
 	    if (!(ctx->virname = malloc(ctx->size_viruses * sizeof(char *)))) {
846 845
 		cli_errmsg("cli_append_virus: fails on malloc() - virus %s virname not appended.\n", virname);
847 846
 		return;
848 847
 	    }
848
+	    ctx->size_viruses = 2;
849 849
 	} else if (ctx->num_viruses+1 == ctx->size_viruses) {
850
-	    ctx->size_viruses *= 2;
851
-	    if ((ctx->virname = realloc((void *)ctx->virname, ctx->size_viruses * sizeof (char *))) == NULL) {
850
+	    void * newptr = NULL;
851
+	    if ((newptr = realloc((void *)ctx->virname, 2 * ctx->size_viruses * sizeof (char *))) == NULL) {
852 852
 		cli_errmsg("cli_append_virus: fails on realloc() - virus %s virname not appended.\n", virname);
853 853
 		return;
854 854
 	    }
855
+	    ctx->virname = newptr;
856
+	    ctx->size_viruses *= 2;
855 857
 	}
856 858
 	ctx->virname[ctx->num_viruses++] = virname;
857 859
 	ctx->virname[ctx->num_viruses] = NULL;