git-svn: trunk@3533
Tomasz Kojm authored on 2008/01/24 01:38:36... | ... |
@@ -1,3 +1,7 @@ |
1 |
+Wed Jan 23 17:15:28 CET 2008 (tk) |
|
2 |
+--------------------------------- |
|
3 |
+ * shared/output.c: fix handling of special characters in mprintf/logg (bb#360) |
|
4 |
+ |
|
1 | 5 |
Wed Jan 23 17:19:59 EET 2008 (edwin) |
2 | 6 |
------------------------------------ |
3 | 7 |
* libclamav/htmlnorm.c, entconv.c: optimize char reference handling |
... | ... |
@@ -216,7 +216,7 @@ static int dirscan(const char *dirname, const char **virname, unsigned long int |
216 | 216 |
if(scanret == CL_VIRUS) { |
217 | 217 |
|
218 | 218 |
mdprintf(odesc, "%s: %s FOUND\n", fname, *virname); |
219 |
- logg("%s: %s FOUND\n", fname, *virname); |
|
219 |
+ logg("~%s: %s FOUND\n", fname, *virname); |
|
220 | 220 |
virusaction(fname, *virname, copt); |
221 | 221 |
if(type == TYPE_SCAN) { |
222 | 222 |
closedir(dd); |
... | ... |
@@ -227,7 +227,7 @@ static int dirscan(const char *dirname, const char **virname, unsigned long int |
227 | 227 |
|
228 | 228 |
} else if(scanret != CL_CLEAN) { |
229 | 229 |
mdprintf(odesc, "%s: %s ERROR\n", fname, cl_strerror(scanret)); |
230 |
- logg("%s: %s ERROR\n", fname, cl_strerror(scanret)); |
|
230 |
+ logg("~%s: %s ERROR\n", fname, cl_strerror(scanret)); |
|
231 | 231 |
if(scanret == CL_EMEM) { |
232 | 232 |
closedir(dd); |
233 | 233 |
free(fname); |
... | ... |
@@ -235,7 +235,7 @@ static int dirscan(const char *dirname, const char **virname, unsigned long int |
235 | 235 |
} |
236 | 236 |
|
237 | 237 |
} else if(logok) { |
238 |
- logg("%s: OK\n", fname); |
|
238 |
+ logg("~%s: OK\n", fname); |
|
239 | 239 |
} |
240 | 240 |
free(fname); |
241 | 241 |
} |
... | ... |
@@ -277,13 +277,13 @@ static void multiscanfile(void *arg) |
277 | 277 |
|
278 | 278 |
if(ret == CL_VIRUS) { |
279 | 279 |
mdprintf(tag->sd, "%s: %s FOUND\n", tag->fname, virname); |
280 |
- logg("%s: %s FOUND\n", tag->fname, virname); |
|
280 |
+ logg("~%s: %s FOUND\n", tag->fname, virname); |
|
281 | 281 |
virusaction(tag->fname, virname, tag->copt); |
282 | 282 |
} else if(ret != CL_CLEAN) { |
283 | 283 |
mdprintf(tag->sd, "%s: %s ERROR\n", tag->fname, cl_strerror(ret)); |
284 |
- logg("%s: %s ERROR\n", tag->fname, cl_strerror(ret)); |
|
284 |
+ logg("~%s: %s ERROR\n", tag->fname, cl_strerror(ret)); |
|
285 | 285 |
} else if(logok) { |
286 |
- logg("%s: OK\n", tag->fname); |
|
286 |
+ logg("~%s: OK\n", tag->fname); |
|
287 | 287 |
} |
288 | 288 |
|
289 | 289 |
free(tag->fname); |
... | ... |
@@ -333,15 +333,15 @@ int scan(const char *filename, unsigned long int *scanned, const struct cl_engin |
333 | 333 |
|
334 | 334 |
if(ret == CL_VIRUS) { |
335 | 335 |
mdprintf(odesc, "%s: %s FOUND\n", filename, virname); |
336 |
- logg("%s: %s FOUND\n", filename, virname); |
|
336 |
+ logg("~%s: %s FOUND\n", filename, virname); |
|
337 | 337 |
virusaction(filename, virname, copt); |
338 | 338 |
} else if(ret != CL_CLEAN) { |
339 | 339 |
mdprintf(odesc, "%s: %s ERROR\n", filename, cl_strerror(ret)); |
340 |
- logg("%s: %s ERROR\n", filename, cl_strerror(ret)); |
|
340 |
+ logg("~%s: %s ERROR\n", filename, cl_strerror(ret)); |
|
341 | 341 |
if(ret == CL_EMEM) |
342 | 342 |
return -2; |
343 | 343 |
} else if (logok) { |
344 |
- logg("%s: OK\n", filename); |
|
344 |
+ logg("~%s: OK\n", filename); |
|
345 | 345 |
} |
346 | 346 |
break; |
347 | 347 |
case S_IFDIR: |
... | ... |
@@ -90,12 +90,12 @@ static int dsresult(int sockd, const struct optstruct *opt) |
90 | 90 |
} else { |
91 | 91 |
*pt = 0; |
92 | 92 |
if(unlink(buff)) { |
93 |
- mprintf("%s: Can't remove.\n", buff); |
|
94 |
- logg("%s: Can't remove.\n", buff); |
|
93 |
+ mprintf("~%s: Can't remove.\n", buff); |
|
94 |
+ logg("~%s: Can't remove.\n", buff); |
|
95 | 95 |
notremoved++; |
96 | 96 |
} else { |
97 |
- mprintf("%s: Removed.\n", buff); |
|
98 |
- logg("%s: Removed.\n", buff); |
|
97 |
+ mprintf("~%s: Removed.\n", buff); |
|
98 |
+ logg("~%s: Removed.\n", buff); |
|
99 | 99 |
} |
100 | 100 |
} |
101 | 101 |
} |
... | ... |
@@ -134,7 +134,7 @@ static int dsfile(int sockd, const char *scantype, const char *filename, const s |
134 | 134 |
ret = dsresult(sockd, opt); |
135 | 135 |
|
136 | 136 |
if(!ret) |
137 |
- logg("%s: OK\n", filename); |
|
137 |
+ logg("~%s: OK\n", filename); |
|
138 | 138 |
|
139 | 139 |
return ret; |
140 | 140 |
} |
... | ... |
@@ -626,7 +626,7 @@ static void move_infected(const char *filename, const struct optstruct *opt) |
626 | 626 |
} |
627 | 627 |
} |
628 | 628 |
|
629 |
- logg("%s: %s to '%s'\n", filename, (moveflag) ? "moved" : "copied", movefilename); |
|
629 |
+ logg("~%s: %s to '%s'\n", filename, (moveflag) ? "moved" : "copied", movefilename); |
|
630 | 630 |
|
631 | 631 |
free(movefilename); |
632 | 632 |
} |
... | ... |
@@ -645,7 +645,7 @@ static int checkfile(const char *filename, const struct cl_engine *engine, const |
645 | 645 |
} |
646 | 646 |
|
647 | 647 |
if((ret = cl_scandesc(fd, &virname, &info.blocks, engine, limits, options)) == CL_VIRUS) { |
648 |
- logg("%s: %s FOUND\n", filename, virname); |
|
648 |
+ logg("~%s: %s FOUND\n", filename, virname); |
|
649 | 649 |
info.ifiles++; |
650 | 650 |
|
651 | 651 |
if(bell) |
... | ... |
@@ -653,10 +653,10 @@ static int checkfile(const char *filename, const struct cl_engine *engine, const |
653 | 653 |
|
654 | 654 |
} else if(ret == CL_CLEAN) { |
655 | 655 |
if(!printinfected && printclean) |
656 |
- mprintf("%s: OK\n", filename); |
|
656 |
+ mprintf("~%s: OK\n", filename); |
|
657 | 657 |
} else |
658 | 658 |
if(!printinfected) |
659 |
- logg("%s: %s\n", filename, cl_strerror(ret)); |
|
659 |
+ logg("~%s: %s\n", filename, cl_strerror(ret)); |
|
660 | 660 |
|
661 | 661 |
close(fd); |
662 | 662 |
return ret; |
... | ... |
@@ -818,7 +818,7 @@ static int scancompressed(const char *filename, struct cl_engine *engine, const |
818 | 818 |
logg("^%s: Can't remove\n", filename); |
819 | 819 |
info.notremoved++; |
820 | 820 |
} else { |
821 |
- logg("%s: Removed\n", filename); |
|
821 |
+ logg("~%s: Removed\n", filename); |
|
822 | 822 |
} |
823 | 823 |
} else if (opt_check(opt, "move") || opt_check(opt, "copy")) |
824 | 824 |
move_infected(filename, opt); |
... | ... |
@@ -835,14 +835,14 @@ static int scancompressed(const char *filename, struct cl_engine *engine, const |
835 | 835 |
logg("^%s: Can't remove\n", filename); |
836 | 836 |
info.notremoved++; |
837 | 837 |
} else { |
838 |
- logg("%s: Removed\n", filename); |
|
838 |
+ logg("~%s: Removed\n", filename); |
|
839 | 839 |
} |
840 | 840 |
} else if (opt_check(opt, "move") || opt_check(opt, "copy")) |
841 | 841 |
move_infected(filename, opt); |
842 | 842 |
} |
843 | 843 |
return ret; |
844 | 844 |
case 1: |
845 |
- logg("%s: Infected.Archive FOUND\n", filename); |
|
845 |
+ logg("~%s: Infected.Archive FOUND\n", filename); |
|
846 | 846 |
|
847 | 847 |
if(bell) |
848 | 848 |
fprintf(stderr, "\007"); |
... | ... |
@@ -852,7 +852,7 @@ static int scancompressed(const char *filename, struct cl_engine *engine, const |
852 | 852 |
logg("^%s: Can't remove\n", filename); |
853 | 853 |
info.notremoved++; |
854 | 854 |
} else { |
855 |
- logg("%s: Removed\n", filename); |
|
855 |
+ logg("~%s: Removed\n", filename); |
|
856 | 856 |
} |
857 | 857 |
} else if (opt_check(opt, "move") || opt_check(opt, "copy")) |
858 | 858 |
move_infected(filename, opt); |
... | ... |
@@ -933,7 +933,7 @@ static int scandenied(const char *filename, struct cl_engine *engine, const stru |
933 | 933 |
logg("^%s: Can't remove\n", filename); |
934 | 934 |
info.notremoved++; |
935 | 935 |
} else { |
936 |
- logg("%s: Removed\n", filename); |
|
936 |
+ logg("~%s: Removed\n", filename); |
|
937 | 937 |
} |
938 | 938 |
} else if (opt_check(opt, "move") || opt_check(opt, "copy")) |
939 | 939 |
move_infected(filename, opt); |
... | ... |
@@ -961,7 +961,7 @@ int scanfile(const char *filename, struct cl_engine *engine, const struct passwd |
961 | 961 |
if(stat(filename, &sb) != -1) |
962 | 962 |
if(sb.st_dev == procdev) { |
963 | 963 |
if(!printinfected) |
964 |
- logg("%s: Excluded (/proc)\n", filename); |
|
964 |
+ logg("~%s: Excluded (/proc)\n", filename); |
|
965 | 965 |
return 0; |
966 | 966 |
} |
967 | 967 |
#endif |
... | ... |
@@ -971,7 +971,7 @@ int scanfile(const char *filename, struct cl_engine *engine, const struct passwd |
971 | 971 |
while(argument) { |
972 | 972 |
if(match_regex(filename, argument) == 1) { |
973 | 973 |
if(!printinfected) |
974 |
- logg("%s: Excluded\n", filename); |
|
974 |
+ logg("~%s: Excluded\n", filename); |
|
975 | 975 |
return 0; |
976 | 976 |
} |
977 | 977 |
argument = opt_nextarg(&optnode, "exclude"); |
... | ... |
@@ -991,14 +991,14 @@ int scanfile(const char *filename, struct cl_engine *engine, const struct passwd |
991 | 991 |
|
992 | 992 |
if(!included) { |
993 | 993 |
if(!printinfected) |
994 |
- logg("%s: Excluded\n", filename); |
|
994 |
+ logg("~%s: Excluded\n", filename); |
|
995 | 995 |
return 0; |
996 | 996 |
} |
997 | 997 |
} |
998 | 998 |
|
999 | 999 |
if(fileinfo(filename, 1) == 0) { |
1000 | 1000 |
if(!printinfected) |
1001 |
- logg("%s: Empty file\n", filename); |
|
1001 |
+ logg("~%s: Empty file\n", filename); |
|
1002 | 1002 |
return 0; |
1003 | 1003 |
} |
1004 | 1004 |
|
... | ... |
@@ -1006,7 +1006,7 @@ int scanfile(const char *filename, struct cl_engine *engine, const struct passwd |
1006 | 1006 |
if(geteuid()) |
1007 | 1007 |
if(checkaccess(filename, NULL, R_OK) != 1) { |
1008 | 1008 |
if(!printinfected) |
1009 |
- logg("%s: Access denied\n", filename); |
|
1009 |
+ logg("~%s: Access denied\n", filename); |
|
1010 | 1010 |
return 0; |
1011 | 1011 |
} |
1012 | 1012 |
#endif |
... | ... |
@@ -1028,7 +1028,7 @@ int scanfile(const char *filename, struct cl_engine *engine, const struct passwd |
1028 | 1028 |
logg("^%s: Can't remove\n", filename); |
1029 | 1029 |
info.notremoved++; |
1030 | 1030 |
} else { |
1031 |
- logg("%s: Removed\n", filename); |
|
1031 |
+ logg("~%s: Removed\n", filename); |
|
1032 | 1032 |
} |
1033 | 1033 |
} else if (opt_check(opt, "move") || opt_check(opt, "copy")) |
1034 | 1034 |
move_infected(filename, opt); |
... | ... |
@@ -1092,7 +1092,7 @@ int scanfile(const char *filename, struct cl_engine *engine, const struct passwd |
1092 | 1092 |
logg("^%s: Can't remove\n", filename); |
1093 | 1093 |
info.notremoved++; |
1094 | 1094 |
} else { |
1095 |
- logg("%s: Removed\n", filename); |
|
1095 |
+ logg("~%s: Removed\n", filename); |
|
1096 | 1096 |
} |
1097 | 1097 |
} else if (opt_check(opt, "move") || opt_check(opt, "copy")) |
1098 | 1098 |
move_infected(filename, opt); |
... | ... |
@@ -71,7 +71,7 @@ int treewalk(const char *dirname, struct cl_engine *engine, const struct passwd |
71 | 71 |
while(argument) { |
72 | 72 |
if(match_regex(dirname, argument) == 1) { |
73 | 73 |
if(!printinfected) |
74 |
- logg("%s: Excluded\n", dirname); |
|
74 |
+ logg("~%s: Excluded\n", dirname); |
|
75 | 75 |
return 0; |
76 | 76 |
} |
77 | 77 |
argument = opt_nextarg(&optnode, "exclude-dir"); |
... | ... |
@@ -91,7 +91,7 @@ int treewalk(const char *dirname, struct cl_engine *engine, const struct passwd |
91 | 91 |
|
92 | 92 |
if(!included) { |
93 | 93 |
if(!printinfected) |
94 |
- logg("%s: Excluded\n", dirname); |
|
94 |
+ logg("~%s: Excluded\n", dirname); |
|
95 | 95 |
return 0; |
96 | 96 |
} |
97 | 97 |
} |
... | ... |
@@ -135,7 +135,7 @@ int treewalk(const char *dirname, struct cl_engine *engine, const struct passwd |
135 | 135 |
} |
136 | 136 |
} else { |
137 | 137 |
if(!printinfected) |
138 |
- logg("%s: Can't open directory.\n", dirname); |
|
138 |
+ logg("~%s: Can't open directory.\n", dirname); |
|
139 | 139 |
return 53; |
140 | 140 |
} |
141 | 141 |
|
... | ... |
@@ -237,7 +237,7 @@ int fixperms(const char *dirname) |
237 | 237 |
} |
238 | 238 |
} else { |
239 | 239 |
if(!printinfected) |
240 |
- logg("%s: Can't open directory.\n", dirname); |
|
240 |
+ logg("~%s: Can't open directory.\n", dirname); |
|
241 | 241 |
return 53; |
242 | 242 |
} |
243 | 243 |
|
... | ... |
@@ -285,7 +285,7 @@ int du(const char *dirname, struct s_du *n) |
285 | 285 |
} |
286 | 286 |
} else { |
287 | 287 |
if(!printinfected) |
288 |
- logg("%s: Can't open directory.\n", dirname); |
|
288 |
+ logg("~%s: Can't open directory.\n", dirname); |
|
289 | 289 |
return 53; |
290 | 290 |
} |
291 | 291 |
|
... | ... |
@@ -128,7 +128,7 @@ void logg_close(void) { |
128 | 128 |
|
129 | 129 |
int logg(const char *str, ...) |
130 | 130 |
{ |
131 |
- va_list args, argscpy, argsout; |
|
131 |
+ va_list args; |
|
132 | 132 |
#ifdef F_WRLCK |
133 | 133 |
struct flock fl; |
134 | 134 |
#endif |
... | ... |
@@ -139,9 +139,9 @@ int logg(const char *str, ...) |
139 | 139 |
|
140 | 140 |
|
141 | 141 |
va_start(args, str); |
142 |
- /* va_copy is less portable so we just use va_start once more */ |
|
143 |
- va_start(argscpy, str); |
|
144 |
- va_start(argsout, str); |
|
142 |
+ vsnprintf(vbuff, sizeof(vbuff), str, args); |
|
143 |
+ va_end(args); |
|
144 |
+ vbuff[1024] = 0; |
|
145 | 145 |
|
146 | 146 |
#ifdef CL_THREAD_SAFE |
147 | 147 |
pthread_mutex_lock(&logg_mutex); |
... | ... |
@@ -188,7 +188,7 @@ int logg(const char *str, ...) |
188 | 188 |
/* Need to avoid logging time for verbose messages when logverbose |
189 | 189 |
is not set or we get a bunch of timestamps in the log without |
190 | 190 |
newlines... */ |
191 |
- if(logg_time && ((*str != '*') || logg_verbose)) { |
|
191 |
+ if(logg_time && ((*vbuff != '*') || logg_verbose)) { |
|
192 | 192 |
time(&currtime); |
193 | 193 |
pt = ctime(&currtime); |
194 | 194 |
timestr = calloc(strlen(pt), 1); |
... | ... |
@@ -197,22 +197,18 @@ int logg(const char *str, ...) |
197 | 197 |
free(timestr); |
198 | 198 |
} |
199 | 199 |
|
200 |
- _(str); |
|
201 |
- if(*str == '!') { |
|
202 |
- fprintf(logg_fd, "ERROR: "); |
|
203 |
- vfprintf(logg_fd, str + 1, args); |
|
204 |
- } else if(*str == '^') { |
|
205 |
- if(!logg_nowarn) { |
|
206 |
- fprintf(logg_fd, "WARNING: "); |
|
207 |
- vfprintf(logg_fd, str + 1, args); |
|
208 |
- } |
|
209 |
- } else if(*str == '*') { |
|
200 |
+ if(*vbuff == '!') { |
|
201 |
+ fprintf(logg_fd, "ERROR: %s", vbuff + 1); |
|
202 |
+ } else if(*vbuff == '^') { |
|
203 |
+ if(!logg_nowarn) |
|
204 |
+ fprintf(logg_fd, "WARNING: %s", vbuff + 1); |
|
205 |
+ } else if(*vbuff == '*') { |
|
210 | 206 |
if(logg_verbose) |
211 |
- vfprintf(logg_fd, str + 1, args); |
|
212 |
- } else if(*str == '#') { |
|
213 |
- vfprintf(logg_fd, str + 1, args); |
|
214 |
- } else vfprintf(logg_fd, str, args); |
|
215 |
- |
|
207 |
+ fprintf(logg_fd, "%s", vbuff + 1); |
|
208 |
+ } else if(*vbuff == '#' || *vbuff == '~') { |
|
209 |
+ fprintf(logg_fd, "%s", vbuff + 1); |
|
210 |
+ } else |
|
211 |
+ fprintf(logg_fd, "%s", vbuff); |
|
216 | 212 |
|
217 | 213 |
fflush(logg_fd); |
218 | 214 |
} |
... | ... |
@@ -220,10 +216,6 @@ int logg(const char *str, ...) |
220 | 220 |
|
221 | 221 |
#if defined(USE_SYSLOG) && !defined(C_AIX) |
222 | 222 |
if(logg_syslog) { |
223 |
- _(str); |
|
224 |
- vsnprintf(vbuff, 1024, str, argscpy); |
|
225 |
- vbuff[1024] = 0; |
|
226 |
- |
|
227 | 223 |
if(vbuff[0] == '!') { |
228 | 224 |
syslog(LOG_ERR, "%s", vbuff + 1); |
229 | 225 |
} else if(vbuff[0] == '^') { |
... | ... |
@@ -233,7 +225,7 @@ int logg(const char *str, ...) |
233 | 233 |
if(logg_verbose) { |
234 | 234 |
syslog(LOG_DEBUG, "%s", vbuff + 1); |
235 | 235 |
} |
236 |
- } else if(vbuff[0] == '#') { |
|
236 |
+ } else if(vbuff[0] == '#' || vbuff[0] == '~') { |
|
237 | 237 |
syslog(LOG_INFO, "%s", vbuff + 1); |
238 | 238 |
} else syslog(LOG_INFO, "%s", vbuff); |
239 | 239 |
|
... | ... |
@@ -241,9 +233,6 @@ int logg(const char *str, ...) |
241 | 241 |
#endif |
242 | 242 |
|
243 | 243 |
if(logg_foreground) { |
244 |
- _(str); |
|
245 |
- vsnprintf(vbuff, 1024, str, argsout); |
|
246 |
- vbuff[1024] = 0; |
|
247 | 244 |
if(vbuff[0] != '#') |
248 | 245 |
mprintf("%s", vbuff); |
249 | 246 |
} |
... | ... |
@@ -252,9 +241,6 @@ int logg(const char *str, ...) |
252 | 252 |
pthread_mutex_unlock(&logg_mutex); |
253 | 253 |
#endif |
254 | 254 |
|
255 |
- va_end(args); |
|
256 |
- va_end(argscpy); |
|
257 |
- va_end(argsout); |
|
258 | 255 |
return 0; |
259 | 256 |
} |
260 | 257 |
|
... | ... |
@@ -307,6 +293,8 @@ void mprintf(const char *str, ...) |
307 | 307 |
} else if(buff[0] == '*') { |
308 | 308 |
if(mprintf_verbose) |
309 | 309 |
fprintf(fd, "%s", &buff[1]); |
310 |
+ } else if(buff[0] == '~') { |
|
311 |
+ fprintf(fd, "%s", &buff[1]); |
|
310 | 312 |
} else fprintf(fd, "%s", buff); |
311 | 313 |
} |
312 | 314 |
|