git-svn: trunk@3454
Tomasz Kojm authored on 2007/12/22 10:45:40... | ... |
@@ -1,3 +1,8 @@ |
1 |
+Sat Dec 22 02:07:55 CET 2007 (tk) |
|
2 |
+--------------------------------- |
|
3 |
+ * freshclam/manager.c: improve db check; make new db available already |
|
4 |
+ in unlink-rename time window |
|
5 |
+ |
|
1 | 6 |
Sat Dec 22 00:10:53 CET 2007 (tk) |
2 | 7 |
--------------------------------- |
3 | 8 |
* libclamav: various platform-specific cleanups |
... | ... |
@@ -910,7 +910,7 @@ static int updatedb(const char *dbname, const char *hostname, char *ip, int *sig |
910 | 910 |
const struct cfgstruct *cpt; |
911 | 911 |
unsigned int nodb = 0, currver = 0, newver = 0, port = 0, i, j; |
912 | 912 |
int ret, ims = -1; |
913 |
- char *pt, cvdfile[32], localname[32], *tmpdir = NULL, *newfile, cwd[512]; |
|
913 |
+ char *pt, cvdfile[32], localname[32], *tmpdir = NULL, *newfile, newdb[512], cwd[512]; |
|
914 | 914 |
const char *proxy = NULL, *user = NULL, *pass = NULL, *uas = NULL; |
915 | 915 |
unsigned int flevel = cl_retflevel(), maxattempts; |
916 | 916 |
int ctimeout, rtimeout; |
... | ... |
@@ -1099,32 +1099,49 @@ static int updatedb(const char *dbname, const char *hostname, char *ip, int *sig |
1099 | 1099 |
} |
1100 | 1100 |
} |
1101 | 1101 |
|
1102 |
- if(!nodb && !access(cvdfile, R_OK) && unlink(cvdfile)) { |
|
1103 |
- logg("!Can't unlink %s. Please fix it and try again.\n", cvdfile); |
|
1102 |
+ if(!(current = cl_cvdhead(newfile))) { |
|
1103 |
+ logg("!Can't parse new database %s\n",newfile); |
|
1104 | 1104 |
unlink(newfile); |
1105 | 1105 |
free(newfile); |
1106 |
- return 53; |
|
1106 |
+ return 55; /* FIXME */ |
|
1107 | 1107 |
} |
1108 | 1108 |
|
1109 |
- if(!nodb && strcmp(cvdfile, localname) && !access(localname, R_OK) && unlink(localname)) { |
|
1110 |
- logg("!Can't unlink %s. Please fix it and try again.\n", localname); |
|
1109 |
+ if(strlen(newfile) > 507) { /* shouldn't happen */ |
|
1110 |
+ logg("!newfile: File name too long\n"); |
|
1111 | 1111 |
unlink(newfile); |
1112 | 1112 |
free(newfile); |
1113 |
- return 53; |
|
1113 |
+ return 70; /* FIXME */ |
|
1114 | 1114 |
} |
1115 | 1115 |
|
1116 |
- if(rename(newfile, localname) == -1) { |
|
1117 |
- logg("!Can't rename %s to %s\n", newfile, localname); |
|
1116 |
+ if(strstr(localname, ".cld")) |
|
1117 |
+ snprintf(newdb, sizeof(newdb), "%s.cld", newfile); |
|
1118 |
+ else |
|
1119 |
+ snprintf(newdb, sizeof(newdb), "%s.cvd", newfile); |
|
1120 |
+ |
|
1121 |
+ if(rename(newfile, newdb) == -1) { |
|
1122 |
+ logg("!Can't rename %s to %s\n", newfile, newdb); |
|
1118 | 1123 |
unlink(newfile); |
1119 | 1124 |
free(newfile); |
1120 | 1125 |
return 57; |
1121 | 1126 |
} |
1122 | 1127 |
free(newfile); |
1123 | 1128 |
|
1124 |
- if(!(current = cl_cvdhead(localname))) { |
|
1125 |
- logg("!Can't parse new database %s\n", localname); |
|
1126 |
- unlink(localname); |
|
1127 |
- return 55; /* FIXME */ |
|
1129 |
+ if(!nodb && !access(cvdfile, R_OK) && unlink(cvdfile)) { |
|
1130 |
+ logg("!Can't unlink %s. Please fix it and try again.\n", cvdfile); |
|
1131 |
+ unlink(newdb); |
|
1132 |
+ return 53; |
|
1133 |
+ } |
|
1134 |
+ |
|
1135 |
+ if(!nodb && strcmp(cvdfile, localname) && !access(localname, R_OK) && unlink(localname)) { |
|
1136 |
+ logg("!Can't unlink %s. Please fix it and try again.\n", localname); |
|
1137 |
+ unlink(newdb); |
|
1138 |
+ return 53; |
|
1139 |
+ } |
|
1140 |
+ |
|
1141 |
+ if(rename(newdb, localname) == -1) { |
|
1142 |
+ logg("!Can't rename %s to %s\n", newdb, localname); |
|
1143 |
+ unlink(newdb); |
|
1144 |
+ return 57; |
|
1128 | 1145 |
} |
1129 | 1146 |
|
1130 | 1147 |
logg("%s updated (version: %d, sigs: %d, f-level: %d, builder: %s)\n", localname, current->version, current->sigs, current->fl, current->builder); |