git-svn: trunk@2349
Nigel Horne authored on 2006/10/08 22:45:10... | ... |
@@ -19,7 +19,7 @@ |
19 | 19 |
* Save the JavaScript embedded in an HTML file, then run the script, saving |
20 | 20 |
* the output in a file that is to be scanned, then remove the script file |
21 | 21 |
*/ |
22 |
-static char const rcsid[] = "$Id: js.c,v 1.3 2006/10/08 12:57:06 njh Exp $"; |
|
22 |
+static char const rcsid[] = "$Id: js.c,v 1.4 2006/10/08 13:45:10 njh Exp $"; |
|
23 | 23 |
|
24 | 24 |
#if HAVE_CONFIG_H |
25 | 25 |
#include "clamav-config.h" |
... | ... |
@@ -64,9 +64,10 @@ cli_scanjs(const char *dir, int desc) |
64 | 64 |
char *buf; /* start of memory mapped area */ |
65 | 65 |
const char *p; |
66 | 66 |
long bytesleft; |
67 |
- int done_header; |
|
67 |
+ int done_header, rc; |
|
68 | 68 |
FILE *fout; |
69 | 69 |
char script_filename[NAME_MAX + 1]; |
70 |
+ extern short cli_leavetemps_flag; |
|
70 | 71 |
|
71 | 72 |
cli_dbgmsg("in cli_scanjs(%s)\n", dir); |
72 | 73 |
|
... | ... |
@@ -95,14 +96,17 @@ cli_scanjs(const char *dir, int desc) |
95 | 95 |
while(p < &buf[size]) { |
96 | 96 |
const char *q = cli_pmemstr(p, bytesleft, "<script", 7); |
97 | 97 |
|
98 |
- if(q != NULL) |
|
98 |
+ if(q == NULL) |
|
99 | 99 |
/* TODO: full case independant search */ |
100 | 100 |
q = cli_pmemstr(p, bytesleft, "<SCRIPT", 7); |
101 | 101 |
|
102 | 102 |
if(q == NULL) |
103 | 103 |
break; |
104 | 104 |
|
105 |
- /* TODO: check language is javascript */ |
|
105 |
+ /* |
|
106 |
+ * TODO: check language is javascript |
|
107 |
+ * TODO: follow src if mail-follow-urls is set |
|
108 |
+ */ |
|
106 | 109 |
|
107 | 110 |
bytesleft -= (q - p); |
108 | 111 |
p = q; |
... | ... |
@@ -118,6 +122,8 @@ cli_scanjs(const char *dir, int desc) |
118 | 118 |
bytesleft--; |
119 | 119 |
|
120 | 120 |
while(bytesleft) { |
121 |
+ char c; |
|
122 |
+ |
|
121 | 123 |
if(*p == '<') { |
122 | 124 |
p++; |
123 | 125 |
if(--bytesleft == 0) |
... | ... |
@@ -138,7 +144,13 @@ cli_scanjs(const char *dir, int desc) |
138 | 138 |
} |
139 | 139 |
break; |
140 | 140 |
} |
141 |
+ c = '<'; |
|
142 |
+ } else { |
|
143 |
+ c = tolower(*p); |
|
144 |
+ p++; |
|
145 |
+ bytesleft--; |
|
141 | 146 |
} |
147 |
+ |
|
142 | 148 |
if(!done_header) { |
143 | 149 |
int fd; |
144 | 150 |
|
... | ... |
@@ -171,26 +183,44 @@ cli_scanjs(const char *dir, int desc) |
171 | 171 |
munmap(buf, size); |
172 | 172 |
return CL_ETMPFILE; |
173 | 173 |
} |
174 |
+ /* |
|
175 |
+ * FIXME: the script file could already contain |
|
176 |
+ * main() |
|
177 |
+ */ |
|
174 | 178 |
fputs("function main()\n{\n", fout); |
179 |
+ cli_dbgmsg("Saving javascript to %s\n", |
|
180 |
+ script_filename); |
|
175 | 181 |
done_header = 1; |
176 | 182 |
} |
177 |
- putc(tolower(*p), fout); |
|
178 |
- |
|
179 |
- p++; |
|
180 |
- bytesleft--; |
|
183 |
+ putc(c, fout); |
|
181 | 184 |
} |
182 | 185 |
} |
183 | 186 |
|
187 |
+ rc = CL_SUCCESS; |
|
188 |
+ |
|
184 | 189 |
if(!done_header) |
185 | 190 |
cli_dbgmsg("No javascript was detected\n"); |
186 | 191 |
else if(fout == NULL) |
187 | 192 |
cli_errmsg("cli_scanjs: fout == NULL\n"); |
188 | 193 |
else { |
194 |
+ /*JSInterpPtr interp = create_interp();*/ |
|
195 |
+ |
|
189 | 196 |
fputs("\n}\nmain();\n", fout); |
190 | 197 |
fclose(fout); |
191 |
- /* TODO: NGS on the script file */ |
|
198 |
+ |
|
199 |
+ /* |
|
200 |
+ * Run NGS on the file |
|
201 |
+ */ |
|
202 |
+ /* |
|
203 |
+ if(!js_eval_file(interp, script_filename)) { |
|
204 |
+ cli_warnmsg("JS failed: %s\n", js_error_message(interp)); |
|
205 |
+ rc = CL_EIO; |
|
206 |
+ } |
|
207 |
+ js_destroy_interp(interp);*/ |
|
192 | 208 |
} |
193 |
- unlink(script_filename); |
|
209 |
+ |
|
210 |
+ if(!cli_leavetemps_flag) |
|
211 |
+ unlink(script_filename); |
|
194 | 212 |
|
195 | 213 |
munmap(buf, size); |
196 | 214 |
return CL_CLEAN; |