Re: clamd: Keep scanning while reloading database

Julius Plenz <[email protected]>
Newsgroups gmane.comp.security.virus.clamav.devel
Message-ID <[email protected]>
Hi, Mark!

* Mark Pizzolato - ClamAV-devel <[email protected]> [2014-04-10 18:45]:
> One more question (as I originally said, I haven't looked closely at
> either the current code or your suggested patch)...  What happens if
> multiple reload requests come in right after each other while
> scanning thread(s) are still scanning some file(s)?

Then the threads would override each other's work and you'd have
unreferenced engines flying around. Good catch. Pasted below is a
patch to address that problem.

Julius
-- 
From a178a359970d65a0c439c8e3a84e861cbc9fd944 Mon Sep 17 00:00:00 2001
From: Julius Plenz <[email protected]>
Date: Mon, 14 Apr 2014 11:05:06 +0200
Subject: [PATCH] Introduce a reload_in_progress flag

---
 clamd/server-th.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/clamd/server-th.c b/clamd/server-th.c
index 9afa2b7..2167475 100644
--- a/clamd/server-th.c
+++ b/clamd/server-th.c
@@ -64,6 +64,7 @@
 int progexit = 0;
 pthread_mutex_t exit_mutex = PTHREAD_MUTEX_INITIALIZER;
 int reload = 0;
+volatile int reload_in_progress = 0;
 struct cl_engine *reload_engine = NULL;
 time_t reloaded_time = 0;
 pthread_mutex_t reload_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -226,6 +227,7 @@ static void *reload_db(void *argp)
     pthread_mutex_lock(&reload_mutex);
     time(&reloaded_time);
     reload_engine = engine;
+    reload_in_progress = 0;
     pthread_mutex_unlock(&reload_mutex);
 }
 
@@ -1355,7 +1357,11 @@ int recvloop_th(int *socketds, unsigned nsockets, struct cl_engine *engine, unsi
 
 	/* DB reload */
 	pthread_mutex_lock(&reload_mutex);
-	if(reload) {
+	if(reload && reload_in_progress) {
+	    logg("Database reload already in progress; ignoring reload request.\n");
+	    reload = 0;
+	    pthread_mutex_unlock(&reload_mutex);
+	} else if(reload) {
 	    pthread_mutex_unlock(&reload_mutex);
 	    struct reload_db_args reload_db_args = {
 		.engine = engine,
@@ -1364,6 +1370,7 @@ int recvloop_th(int *socketds, unsigned nsockets, struct cl_engine *engine, unsi
 	    };
 	    pthread_mutex_lock(&reload_mutex);
 	    reload = 0;
+	    reload_in_progress = 1;
 	    pthread_create(&reload_th, NULL, reload_db, &reload_db_args);
 	    pthread_mutex_unlock(&reload_mutex);
 	} else {
-- 
1.9.0-zedat

_______________________________________________
http://lurker.clamav.net/list/clamav-devel.html
Please submit your patches to our Bugzilla: http://bugs.clamav.net
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.