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