git-svn: trunk@2099
Tomasz Kojm authored on 2006/07/19 00:59:29... | ... |
@@ -1,3 +1,9 @@ |
1 |
+Tue Jul 18 17:54:42 CEST 2006 (tk) |
|
2 |
+---------------------------------- |
|
3 |
+ * sigtool/sigtool.c: automatically verify patches created with --diff; |
|
4 |
+ new option --verify-cdiff for verification from command |
|
5 |
+ line |
|
6 |
+ |
|
1 | 7 |
Tue Jul 18 15:57:33 BST 2006 (njh) |
2 | 8 |
---------------------------------- |
3 | 9 |
* libclamav/message.c: Fixed compilation warning messages |
... | ... |
@@ -931,8 +931,10 @@ static int runcdiff(struct optstruct *opt) |
931 | 931 |
int fd, ret; |
932 | 932 |
|
933 | 933 |
|
934 |
- if((fd = open(opt_arg(opt, "run-cdiff"), O_RDONLY)) == -1) |
|
934 |
+ if((fd = open(opt_arg(opt, "run-cdiff"), O_RDONLY)) == -1) { |
|
935 |
+ mprintf("!runcdiff: Can't open file %s\n", opt_arg(opt, "run-cdiff")); |
|
935 | 936 |
return -1; |
937 |
+ } |
|
936 | 938 |
|
937 | 939 |
ret = cdiff_apply(fd); |
938 | 940 |
close(fd); |
... | ... |
@@ -1042,12 +1044,119 @@ static int compare(const char *oldpath, const char *newpath, FILE *diff) |
1042 | 1042 |
return 0; |
1043 | 1043 |
} |
1044 | 1044 |
|
1045 |
+static int verifycdiff(const char *diff, const char *cvd) |
|
1046 |
+{ |
|
1047 |
+ char *tempdir, cwd[512], buff[1024], info[32], *pt, *md5; |
|
1048 |
+ FILE *fh; |
|
1049 |
+ int ret = 0, fd; |
|
1050 |
+ |
|
1051 |
+ |
|
1052 |
+ tempdir = cli_gentemp(NULL); |
|
1053 |
+ if(!tempdir) { |
|
1054 |
+ mprintf("!verifycdiff: Can't generate temporary name for tempdir\n"); |
|
1055 |
+ return -1; |
|
1056 |
+ } |
|
1057 |
+ |
|
1058 |
+ if(mkdir(tempdir, 0700) == -1) { |
|
1059 |
+ mprintf("!verifycdiff: Can't create directory %s\n", tempdir); |
|
1060 |
+ free(tempdir); |
|
1061 |
+ return -1; |
|
1062 |
+ } |
|
1063 |
+ |
|
1064 |
+ if(cvd_unpack(cvd, tempdir) == -1) { |
|
1065 |
+ mprintf("!verifycdiff: Can't unpack CVD file %s\n", cvd); |
|
1066 |
+ rmdirs(tempdir); |
|
1067 |
+ free(tempdir); |
|
1068 |
+ return -1; |
|
1069 |
+ } |
|
1070 |
+ |
|
1071 |
+ if((fd = open(diff, O_RDONLY)) == -1) { |
|
1072 |
+ mprintf("!verifycdiff: Can't open diff file %s\n", diff); |
|
1073 |
+ rmdirs(tempdir); |
|
1074 |
+ free(tempdir); |
|
1075 |
+ return -1; |
|
1076 |
+ } |
|
1077 |
+ |
|
1078 |
+ getcwd(cwd, sizeof(cwd)); |
|
1079 |
+ |
|
1080 |
+ if(chdir(tempdir) == -1) { |
|
1081 |
+ mprintf("!verifycdiff: Can't chdir to %s\n", tempdir); |
|
1082 |
+ rmdirs(tempdir); |
|
1083 |
+ free(tempdir); |
|
1084 |
+ close(fd); |
|
1085 |
+ return -1; |
|
1086 |
+ } |
|
1087 |
+ |
|
1088 |
+ if(cdiff_apply(fd) == -1) { |
|
1089 |
+ mprintf("!verifycdiff: Can't apply %s\n", diff); |
|
1090 |
+ chdir(cwd); |
|
1091 |
+ rmdirs(tempdir); |
|
1092 |
+ free(tempdir); |
|
1093 |
+ close(fd); |
|
1094 |
+ return -1; |
|
1095 |
+ } |
|
1096 |
+ close(fd); |
|
1097 |
+ |
|
1098 |
+ if(strstr(cvd, "main.cvd")) |
|
1099 |
+ strcpy(info, "main.info"); |
|
1100 |
+ else |
|
1101 |
+ strcpy(info, "daily.info"); |
|
1102 |
+ |
|
1103 |
+ if(!(fh = fopen(info, "r"))) { |
|
1104 |
+ mprintf("!verifycdiff: Can't open %s\n", info); |
|
1105 |
+ chdir(cwd); |
|
1106 |
+ rmdirs(tempdir); |
|
1107 |
+ free(tempdir); |
|
1108 |
+ return -1; |
|
1109 |
+ } |
|
1110 |
+ |
|
1111 |
+ fgets(buff, sizeof(buff), fh); |
|
1112 |
+ |
|
1113 |
+ if(strncmp(buff, "ClamAV-VDB", 10)) { |
|
1114 |
+ mprintf("!verifycdiff: Incorrect info file %s\n", info); |
|
1115 |
+ chdir(cwd); |
|
1116 |
+ rmdirs(tempdir); |
|
1117 |
+ free(tempdir); |
|
1118 |
+ return -1; |
|
1119 |
+ } |
|
1120 |
+ |
|
1121 |
+ while(fgets(buff, sizeof(buff), fh)) { |
|
1122 |
+ cli_chomp(buff); |
|
1123 |
+ if(!(pt = strchr(buff, ':'))) { |
|
1124 |
+ mprintf("!verifycdiff: Incorrect format of %s\n", info); |
|
1125 |
+ ret = -1; |
|
1126 |
+ break; |
|
1127 |
+ } |
|
1128 |
+ *pt++ = 0; |
|
1129 |
+ if(!(md5 = cli_md5file(buff))) { |
|
1130 |
+ mprintf("!verifycdiff: Can't generate MD5 for %s\n", buff); |
|
1131 |
+ ret = -1; |
|
1132 |
+ break; |
|
1133 |
+ } |
|
1134 |
+ if(strcmp(pt, md5)) { |
|
1135 |
+ mprintf("!verifycdiff: %s has incorrect checksum\n", buff); |
|
1136 |
+ ret = -1; |
|
1137 |
+ break; |
|
1138 |
+ } |
|
1139 |
+ } |
|
1140 |
+ |
|
1141 |
+ fclose(fh); |
|
1142 |
+ chdir(cwd); |
|
1143 |
+ rmdirs(tempdir); |
|
1144 |
+ free(tempdir); |
|
1145 |
+ |
|
1146 |
+ if(!ret) |
|
1147 |
+ mprintf("Verification: %s correctly applies to %s\n", diff, cvd); |
|
1148 |
+ |
|
1149 |
+ return ret; |
|
1150 |
+} |
|
1151 |
+ |
|
1045 | 1152 |
static int makediff(struct optstruct *opt) |
1046 | 1153 |
{ |
1047 | 1154 |
FILE *diff; |
1048 | 1155 |
DIR *dd; |
1049 | 1156 |
struct dirent *dent; |
1050 |
- char *odir, *ndir, opath[1024], name[32]; |
|
1157 |
+ char *odir, *ndir, opath[1024], name[32], broken[32], cwd[512]; |
|
1051 | 1158 |
struct cl_cvd *cvd; |
1052 | 1159 |
unsigned int oldver, newver; |
1053 | 1160 |
|
... | ... |
@@ -1125,6 +1234,8 @@ static int makediff(struct optstruct *opt) |
1125 | 1125 |
else |
1126 | 1126 |
snprintf(name, sizeof(name), "daily-%u.cdiff", newver); |
1127 | 1127 |
|
1128 |
+ getcwd(cwd, sizeof(cwd)); |
|
1129 |
+ |
|
1128 | 1130 |
if(!(diff = fopen(name, "w"))) { |
1129 | 1131 |
mprintf("!makediff: Can't open %s for writing\n", name); |
1130 | 1132 |
rmdirs(odir); |
... | ... |
@@ -1180,6 +1291,21 @@ static int makediff(struct optstruct *opt) |
1180 | 1180 |
rmdirs(ndir); |
1181 | 1181 |
free(odir); |
1182 | 1182 |
free(ndir); |
1183 |
+ mprintf("Generated diff file %s\n", name); |
|
1184 |
+ |
|
1185 |
+ chdir(cwd); |
|
1186 |
+ |
|
1187 |
+ if(verifycdiff(name, opt_arg(opt, "diff")) == -1) { |
|
1188 |
+ snprintf(broken, sizeof(broken), "%s.broken", name); |
|
1189 |
+ if(rename(name, broken)) { |
|
1190 |
+ unlink(name); |
|
1191 |
+ mprintf("!Generated file is incorrect, removed"); |
|
1192 |
+ } else { |
|
1193 |
+ mprintf("!Generated file is incorrect, renamed to %s\n", broken); |
|
1194 |
+ } |
|
1195 |
+ return -1; |
|
1196 |
+ } |
|
1197 |
+ |
|
1183 | 1198 |
return 0; |
1184 | 1199 |
} |
1185 | 1200 |
|
... | ... |
@@ -1210,6 +1336,7 @@ void help(void) |
1210 | 1210 |
mprintf(" --vba-hex=FILE Extract Word6 macro code with hex values\n"); |
1211 | 1211 |
mprintf(" --diff=OLD NEW -d OLD NEW Create diff for OLD and NEW CVDs\n"); |
1212 | 1212 |
mprintf(" --run-cdiff=FILE -r FILE Execute update script FILE in cwd\n"); |
1213 |
+ mprintf(" --verify-cdiff=DIFF CVD Verify DIFF against CVD\n"); |
|
1213 | 1214 |
mprintf("\n"); |
1214 | 1215 |
|
1215 | 1216 |
return; |
... | ... |
@@ -1241,6 +1368,7 @@ int main(int argc, char **argv) |
1241 | 1241 |
{"vba-hex", 1, 0, 0}, |
1242 | 1242 |
{"diff", 1, 0, 'd'}, |
1243 | 1243 |
{"run-cdiff", 1, 0, 'r'}, |
1244 |
+ {"verify-cdiff", 1, 0, 0}, |
|
1244 | 1245 |
{0, 0, 0, 0} |
1245 | 1246 |
}; |
1246 | 1247 |
|
... | ... |
@@ -1269,6 +1397,7 @@ int main(int argc, char **argv) |
1269 | 1269 |
if(opt_check(opt, "help")) { |
1270 | 1270 |
opt_free(opt); |
1271 | 1271 |
help(); |
1272 |
+ return 0; |
|
1272 | 1273 |
} |
1273 | 1274 |
|
1274 | 1275 |
if(opt_check(opt, "hex-dump")) |
... | ... |
@@ -1293,10 +1422,16 @@ int main(int argc, char **argv) |
1293 | 1293 |
ret = makediff(opt); |
1294 | 1294 |
else if(opt_check(opt, "run-cdiff")) |
1295 | 1295 |
ret = runcdiff(opt); |
1296 |
- else |
|
1296 |
+ else if(opt_check(opt, "verify-cdiff")) { |
|
1297 |
+ if(!opt->filename) { |
|
1298 |
+ mprintf("!makediff: --diff requires two arguments\n"); |
|
1299 |
+ ret = -1; |
|
1300 |
+ } else { |
|
1301 |
+ ret = verifycdiff(opt_arg(opt, "verify-cdiff"), opt->filename); |
|
1302 |
+ } |
|
1303 |
+ } else |
|
1297 | 1304 |
help(); |
1298 | 1305 |
|
1299 |
- |
|
1300 | 1306 |
opt_free(opt); |
1301 | 1307 |
return ret ? 1 : 0; |
1302 | 1308 |
} |