Browse code

fix handling of special characters in mprintf/logg (bb#360)

git-svn: trunk@3533

Tomasz Kojm authored on 2008/01/24 01:38:36
Showing 6 changed files
... ...
@@ -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