make cli_lockdb() errors non critical (bb#232)

git-svn: trunk@2630
remotes/push_mirror/metadata
Tomasz Kojm 19 years ago
parent 134ce6c89f
commit 148986bf8a
  1. 6
      clamav-devel/ChangeLog
  2. 20
      clamav-devel/libclamav/lockdb.c
  3. 8
      clamav-devel/libclamav/readdb.c

@ -1,3 +1,9 @@
Mon Jan 15 20:58:54 CET 2007 (tk)
---------------------------------
* libclamav: make cli_lockdb() errors non critical (bb#232)
To take full advantage of locking clamscan/clamd must have
write access to the database directory.
Mon Jan 15 20:37:16 CET 2007 (tk)
---------------------------------
* libclamav/lockdb.c: fix bounds errors (bb#237), patch from Edwin

@ -44,6 +44,7 @@
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>
#else
#include <windows.h>
#endif
@ -170,7 +171,7 @@ static int cli_lockdb(const char *dbdirpath, int wait, int writelock)
if(!lock) {
cli_errmsg("cli_lockdb(): Can't allocate lock structure to lock Database Directory: %s\n", dbdirpath);
pthread_mutex_unlock(&lock_mutex);
return CL_ELOCKDB;
return CL_EMEM;
}
lock->lock_link = dblocks;
strcpy(lock->lock_file, lock_file);
@ -179,7 +180,7 @@ static int cli_lockdb(const char *dbdirpath, int wait, int writelock)
dblocks = lock;
}
if(lock->lock_type != -1) {
cli_errmsg("Database Directory: %s already %s locked\n", dbdirpath, (lock->lock_type? "write" : "read"));
cli_dbgmsg("Database Directory: %s already %s locked\n", dbdirpath, (lock->lock_type? "write" : "read"));
pthread_mutex_unlock(&lock_mutex);
return CL_ELOCKDB;
}
@ -189,10 +190,10 @@ static int cli_lockdb(const char *dbdirpath, int wait, int writelock)
if(-1 == (lock->lock_fd = open(lock->lock_file, O_RDWR|O_CREAT|O_TRUNC, S_IRWXU|S_IRWXG|S_IROTH))) {
if((writelock) ||
(-1 == (lock->lock_fd = open(lock->lock_file, O_RDWR, 0)))) {
cli_errmsg("Can't %s Lock file for Database Directory: %s\n", (writelock ? "create" : "open"), dbdirpath);
cli_dbgmsg("Can't %s Lock file for Database Directory: %s\n", (writelock ? "create" : "open"), dbdirpath);
umask(old_mask);
pthread_mutex_unlock(&lock_mutex);
return CL_ELOCKDB;
return CL_EIO; /* or CL_EACCESS */
}
}
umask(old_mask);
@ -208,9 +209,9 @@ static int cli_lockdb(const char *dbdirpath, int wait, int writelock)
if(!(lock->lock_fd = CreateMutexA(&saAttr, TRUE, lock->lock_file))) {
if((GetLastError() != ERROR_ACCESS_DENIED) ||
(!(lock->lock_fd = OpenMutexA(MUTEX_MODIFY_STATE, FALSE, lock->lock_file)))) {
cli_errmsg("Can't Create Mutex Lock for Database Directory: %s\n", dbdirpath);
cli_dbgmsg("Can't Create Mutex Lock for Database Directory: %s\n", dbdirpath);
pthread_mutex_unlock(&lock_mutex);
return CL_ELOCKDB;
return CL_EIO;
}
LastError = ERROR_ALREADY_EXISTS;
}
@ -226,8 +227,11 @@ static int cli_lockdb(const char *dbdirpath, int wait, int writelock)
fl.l_type = (writelock ? F_WRLCK : F_RDLCK);
if(fcntl(lock->lock_fd, ((wait) ? F_SETLKW : F_SETLK), &fl) == -1) {
#ifndef C_WINDOWS
close(lock->lock_fd);
unlink(lock->lock_file);
if(errno != EACCES && errno != EAGAIN) {
close(lock->lock_fd);
unlink(lock->lock_file);
return CL_EIO;
}
#endif
return CL_ELOCKDB;
}

@ -1278,11 +1278,11 @@ static int cli_loaddbdir_l(const char *dirname, struct cl_engine **engine, unsig
static int cli_loaddbdir(const char *dirname, struct cl_engine **engine, unsigned int *signo, unsigned int options)
{
int ret, try = 0;
int ret, try = 0, lock;
cli_dbgmsg("cli_loaddbdir: Acquiring dbdir lock\n");
while(cli_readlockdb(dirname, 0) == CL_ELOCKDB) {
while((lock = cli_readlockdb(dirname, 0)) == CL_ELOCKDB) {
sleep(5);
if(try++ > 24) {
cli_errmsg("cl_load(): Unable to lock database directory: %s\n", dirname);
@ -1291,7 +1291,9 @@ static int cli_loaddbdir(const char *dirname, struct cl_engine **engine, unsigne
}
ret = cli_loaddbdir_l(dirname, engine, signo, options);
cli_unlockdb(dirname);
if(lock == CL_SUCCESS)
cli_unlockdb(dirname);
return ret;
}

Loading…
Cancel
Save