Browse code

force SHUTDOWN on memory errors from libclamav

git-svn-id: file:///var/lib/svn/clamav-devel/trunk/clamav-devel@1071 77e5149b-7576-45b1-b177-96237e5ba77b

Tomasz Kojm authored on 2004/11/08 18:31:57
Showing 3 changed files
... ...
@@ -1,3 +1,7 @@
1
+Mon Nov  8 10:28:41 CET 2004 (tk)
2
+---------------------------------
3
+  * clamd: force SHUTDOWN on memory errors from libclamav
4
+
1 5
 Mon Nov  8 10:01:48 CET 2004 (tk)
2 6
 ---------------------------------
3 7
   * libclamav/scanners.c: handle error conditions of cli_scandesc()
... ...
@@ -154,9 +154,16 @@ int dirscan(const char *dirname, const char **virname, unsigned long int *scanne
154 154
 					return 1;
155 155
 				    } else
156 156
 					ret = 2;
157
+
157 158
 				} else if(scanret != CL_CLEAN) {
158 159
 				    mdprintf(odesc, "%s: %s ERROR\n", fname, cl_strerror(scanret));
159 160
 				    logg("%s: %s ERROR\n", fname, cl_strerror(scanret));
161
+				    if(scanret == CL_EMEM) {
162
+					closedir(dd);
163
+				        free(fname);
164
+				        return -2;
165
+				    }
166
+
160 167
 				} else if(logok) {
161 168
 				    logg("%s: OK\n", fname);
162 169
 				}
... ...
@@ -222,6 +229,8 @@ int scan(const char *filename, unsigned long int *scanned, const struct cl_node
222 222
 	    } else if(ret != CL_CLEAN) {
223 223
 		mdprintf(odesc, "%s: %s ERROR\n", filename, cl_strerror(ret));
224 224
 		logg("%s: %s ERROR\n", filename, cl_strerror(ret));
225
+		if(ret == CL_EMEM)
226
+		    return -2;
225 227
 	    } else if (logok) {
226 228
 		logg("%s: OK\n", filename);
227 229
 	    }
... ...
@@ -93,11 +93,13 @@ int command(int desc, const struct cl_node *root, const struct cl_limits *limits
93 93
     cli_chomp(buff);
94 94
 
95 95
     if(!strncmp(buff, CMD1, strlen(CMD1))) { /* SCAN */
96
-	scan(buff + strlen(CMD1) + 1, NULL, root, limits, options, copt, desc, 0);
96
+	if(scan(buff + strlen(CMD1) + 1, NULL, root, limits, options, copt, desc, 0) == -2)
97
+	    return COMMAND_SHUTDOWN;
97 98
 
98 99
     } else if(!strncmp(buff, CMD2, strlen(CMD2))) { /* RAWSCAN */
99 100
 	opt = options & ~CL_SCAN_ARCHIVE;
100
-	scan(buff + strlen(CMD2) + 1, NULL, root, NULL, opt, copt, desc, 0);
101
+	if(scan(buff + strlen(CMD2) + 1, NULL, root, NULL, opt, copt, desc, 0) == -2)
102
+	    return COMMAND_SHUTDOWN;
101 103
 
102 104
     } else if(!strncmp(buff, CMD3, strlen(CMD3))) { /* QUIT */
103 105
 	return COMMAND_SHUTDOWN;
... ...
@@ -110,7 +112,8 @@ int command(int desc, const struct cl_node *root, const struct cl_limits *limits
110 110
 	mdprintf(desc, "PONG\n");
111 111
 
112 112
     } else if(!strncmp(buff, CMD6, strlen(CMD6))) { /* CONTSCAN */
113
-	scan(buff + strlen(CMD6) + 1, NULL, root, limits, options, copt, desc, 1);
113
+	if(scan(buff + strlen(CMD6) + 1, NULL, root, limits, options, copt, desc, 1) == -2)
114
+	    return COMMAND_SHUTDOWN;
114 115
 
115 116
     } else if(!strncmp(buff, CMD7, strlen(CMD7))) { /* VERSION */
116 117
 	    const char *dbdir;
... ...
@@ -143,7 +146,8 @@ int command(int desc, const struct cl_node *root, const struct cl_limits *limits
143 143
 	free(path);
144 144
 
145 145
     } else if(!strncmp(buff, CMD8, strlen(CMD8))) { /* STREAM */
146
-	scanstream(desc, NULL, root, limits, options, copt);
146
+	if(scanstream(desc, NULL, root, limits, options, copt) == CL_EMEM)
147
+	    return COMMAND_SHUTDOWN;
147 148
 
148 149
     } else if(!strncmp(buff, CMD9, strlen(CMD9))) { /* SESSION */
149 150
 	do {