mirror of
https://github.com/Cisco-Talos/clamav.git
synced 2025-11-01 16:40:54 +00:00
libclamav, freshclam: fix handling of dbs when both daily.cvd and daily.cld
are present in the db directory and ScriptedUpdates are turned off (bb#1739)
This commit is contained in:
parent
5ccfa0b76a
commit
284e1ee4ba
4 changed files with 71 additions and 10 deletions
|
|
@ -1,3 +1,9 @@
|
|||
Tue Nov 3 22:50:30 CET 2009 (tk)
|
||||
---------------------------------
|
||||
* libclamav, freshclam: fix handling of dbs when both daily.cvd and daily.cld
|
||||
are present in the db directory and ScriptedUpdates
|
||||
are turned off (bb#1739)
|
||||
|
||||
Tue Nov 3 15:18:14 CET 2009 )tk)
|
||||
---------------------------------
|
||||
* libclamav/readdb.c: return error if lsig contains redundant subsigs
|
||||
|
|
|
|||
|
|
@ -1684,6 +1684,13 @@ static int updatedb(const char *dbname, const char *hostname, char *ip, int *sig
|
|||
if(unlink(localname))
|
||||
logg("^Can't unlink the old database file %s. Please remove it manually.\n", localname);
|
||||
|
||||
if(!optget(opts, "ScriptedUpdates")->enabled) {
|
||||
snprintf(localname, sizeof(localname), "%s.cld", dbname);
|
||||
if(!access(localname, R_OK))
|
||||
if(unlink(localname))
|
||||
logg("^Can't unlink the old database file %s. Please remove it manually.\n", localname);
|
||||
}
|
||||
|
||||
logg("%s updated (version: %d, sigs: %d, f-level: %d, builder: %s)\n", newdb, current->version, current->sigs, current->fl, current->builder);
|
||||
|
||||
if(flevel < current->fl) {
|
||||
|
|
|
|||
|
|
@ -1692,7 +1692,8 @@ static int cli_loaddbdir(const char *dirname, struct cl_engine *engine, unsigned
|
|||
} result;
|
||||
#endif
|
||||
char *dbfile;
|
||||
int ret = CL_EOPEN;
|
||||
int ret = CL_EOPEN, have_cld;
|
||||
struct cl_cvd *daily_cld, *daily_cvd;
|
||||
|
||||
|
||||
cli_dbgmsg("Loading databases from %s\n", dirname);
|
||||
|
|
@ -1740,8 +1741,38 @@ static int cli_loaddbdir(const char *dirname, struct cl_engine *engine, unsigned
|
|||
}
|
||||
|
||||
sprintf(dbfile, "%s"PATHSEP"daily.cld", dirname);
|
||||
if(access(dbfile, R_OK))
|
||||
have_cld = !access(dbfile, R_OK);
|
||||
if(have_cld) {
|
||||
daily_cld = cl_cvdhead(dbfile);
|
||||
if(!daily_cld) {
|
||||
cli_errmsg("cli_loaddbdir(): error parsing header of %s\n", dbfile);
|
||||
free(dbfile);
|
||||
closedir(dd);
|
||||
return CL_EMALFDB;
|
||||
}
|
||||
}
|
||||
sprintf(dbfile, "%s"PATHSEP"daily.cvd", dirname);
|
||||
if(!access(dbfile, R_OK)) {
|
||||
if(have_cld) {
|
||||
daily_cvd = cl_cvdhead(dbfile);
|
||||
if(!daily_cvd) {
|
||||
cli_errmsg("cli_loaddbdir(): error parsing header of %s\n", dbfile);
|
||||
free(dbfile);
|
||||
if(have_cld)
|
||||
cl_cvdfree(daily_cld);
|
||||
closedir(dd);
|
||||
return CL_EMALFDB;
|
||||
}
|
||||
if(daily_cld->version > daily_cvd->version)
|
||||
sprintf(dbfile, "%s"PATHSEP"daily.cld", dirname);
|
||||
cl_cvdfree(daily_cvd);
|
||||
}
|
||||
} else {
|
||||
sprintf(dbfile, "%s"PATHSEP"daily.cld", dirname);
|
||||
}
|
||||
if(have_cld)
|
||||
cl_cvdfree(daily_cld);
|
||||
|
||||
if(!access(dbfile, R_OK) && (ret = cli_load(dbfile, engine, signo, options, NULL))) {
|
||||
free(dbfile);
|
||||
closedir(dd);
|
||||
|
|
|
|||
|
|
@ -117,6 +117,8 @@ void print_version(const char *dbdir)
|
|||
char *fdbdir = NULL, *path;
|
||||
const char *pt;
|
||||
struct cl_cvd *daily;
|
||||
time_t db_time;
|
||||
unsigned int db_version = 0;
|
||||
|
||||
|
||||
if(dbdir)
|
||||
|
|
@ -136,17 +138,32 @@ void print_version(const char *dbdir)
|
|||
}
|
||||
|
||||
sprintf(path, "%s"PATHSEP"daily.cvd", pt);
|
||||
if(access(path, R_OK))
|
||||
if(!access(path, R_OK)) {
|
||||
daily = cl_cvdhead(path);
|
||||
if(daily) {
|
||||
db_version = daily->version;
|
||||
db_time = daily->stime;
|
||||
cl_cvdfree(daily);
|
||||
}
|
||||
}
|
||||
|
||||
sprintf(path, "%s"PATHSEP"daily.cld", pt);
|
||||
if(!access(path, R_OK)) {
|
||||
daily = cl_cvdhead(path);
|
||||
if(daily) {
|
||||
if(daily->version > db_version) {
|
||||
db_version = daily->version;
|
||||
db_time = daily->stime;
|
||||
}
|
||||
cl_cvdfree(daily);
|
||||
}
|
||||
}
|
||||
|
||||
if(!dbdir)
|
||||
free(fdbdir);
|
||||
|
||||
if(!access(path, R_OK) && (daily = cl_cvdhead(path))) {
|
||||
time_t t = (time_t) daily->stime;
|
||||
|
||||
printf("ClamAV %s/%d/%s", get_version(), daily->version, ctime(&t));
|
||||
cl_cvdfree(daily);
|
||||
if(db_version) {
|
||||
printf("ClamAV %s/%u/%s", get_version(), db_version, ctime(&db_time));
|
||||
} else {
|
||||
printf("ClamAV %s\n",get_version());
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue