freshclam, libclamav: work around possible race condition during db updates (bb#1624)

0.96
Tomasz Kojm 17 years ago
parent 4aa1842a1c
commit 99ca7f53f8
  1. 5
      ChangeLog
  2. 13
      freshclam/manager.c
  3. 1
      libclamav/clamav.h
  4. 11
      libclamav/readdb.c

@ -1,3 +1,8 @@
Tue Aug 4 15:10:12 CEST 2009 (tk)
----------------------------------
* freshclam, libclamav: work around possible race condition during
db updates (bb#1624)
Mon Aug 3 15:22:42 CEST 2009 (tk)
----------------------------------
* freshclam/manager.c: fix confusing error message (bb#1648)

@ -1683,18 +1683,12 @@ static int updatedb(const char *dbname, const char *hostname, char *ip, int *sig
return 55; /* FIXME */
}
if(!nodb && !access(localname, R_OK) && unlink(localname)) {
logg("!Can't unlink %s. Please fix it and try again.\n", localname);
unlink(newfile);
free(newfile);
return 53;
}
#ifdef C_WINDOWS
if(!access(newdb, R_OK) && unlink(newdb)) {
logg("!Can't unlink %s. Please fix the problem manually and try again.\n", newdb);
unlink(newfile);
free(newfile);
cl_cvdfree(current);
return 53;
}
#endif
@ -1703,10 +1697,15 @@ static int updatedb(const char *dbname, const char *hostname, char *ip, int *sig
logg("!Can't rename %s to %s: %s\n", newfile, newdb, strerror(errno));
unlink(newfile);
free(newfile);
cl_cvdfree(current);
return 57;
}
free(newfile);
if(!nodb && !access(localname, R_OK) && strcmp(newdb, localname))
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) {

@ -79,6 +79,7 @@ typedef enum {
#define CL_DB_PUA_INCLUDE 0x100
#define CL_DB_PUA_EXCLUDE 0x200
#define CL_DB_COMPILED 0x400 /* internal */
#define CL_DB_DIRECTORY 0x800 /* internal */
/* recommended db settings */
#define CL_DB_STDOPT (CL_DB_PHISHING | CL_DB_PHISHING_URLS | CL_DB_CVDNOTMP)

@ -39,6 +39,7 @@
#endif
#include <fcntl.h>
#include <zlib.h>
#include <errno.h>
#include "clamav.h"
#include "cvd.h"
@ -1525,6 +1526,14 @@ int cli_load(const char *filename, struct cl_engine *engine, unsigned int *signo
if(!dbio && (fs = fopen(filename, "rb")) == NULL) {
if(options & CL_DB_DIRECTORY) { /* bb#1624 */
if(access(filename, R_OK)) {
if(errno == ENOENT) {
cli_dbgmsg("Detected race condition, ignoring old file %s\n", filename);
return CL_SUCCESS;
}
}
}
cli_errmsg("cli_load(): Can't open file %s\n", filename);
return CL_EOPEN;
}
@ -1769,7 +1778,7 @@ int cl_load(const char *path, struct cl_engine *engine, unsigned int *signo, uns
break;
case S_IFDIR:
ret = cli_loaddbdir(path, engine, signo, dboptions);
ret = cli_loaddbdir(path, engine, signo, dboptions | CL_DB_DIRECTORY);
break;
default:

Loading…
Cancel
Save