[Clamav-devel] clamd: Keep scanning while reloading database

Julius Plenz plenz at cis.fu-berlin.de
Mon Apr 14 05:11:55 EDT 2014


Hi, Mark!

* Mark Pizzolato - ClamAV-devel <clamav-devel at subscriptions.pizzolato.net> [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 <plenz at cis.fu-berlin.de>
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



More information about the clamav-devel mailing list