Browse code

add script verification

git-svn: trunk@2099

Tomasz Kojm authored on 2006/07/19 00:59:29
Showing 2 changed files
... ...
@@ -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
 }