From 52c3c225470fc9c7310e895ef0e2d170b0044923 Mon Sep 17 00:00:00 2001 From: Tomasz Kojm Date: Wed, 7 Feb 2007 17:32:13 +0000 Subject: [PATCH] fix memleaks git-svn: trunk@2678 --- clamav-devel/ChangeLog | 5 +++++ clamav-devel/libclamav/lockdb.c | 28 ++++++++++++++++++++++++++++ clamav-devel/libclamav/lockdb.h | 1 + clamav-devel/libclamav/readdb.c | 1 + clamav-devel/shared/cfgparser.c | 13 +++++++++++-- 5 files changed, 46 insertions(+), 2 deletions(-) diff --git a/clamav-devel/ChangeLog b/clamav-devel/ChangeLog index b2bffc2c7..a3b7f3ae2 100644 --- a/clamav-devel/ChangeLog +++ b/clamav-devel/ChangeLog @@ -1,3 +1,8 @@ +Wed Feb 7 18:30:35 CET 2007 (tk) +--------------------------------- + * libclamav, shared: fix minor memory leaks in lockdb and cfgparser, + patch from Edwin + Wed Feb 7 18:11:32 CET 2007 (tk) --------------------------------- * libclamav: fix memory leaks in mew and unrar and use of uninitialized diff --git a/clamav-devel/libclamav/lockdb.c b/clamav-devel/libclamav/lockdb.c index d3d1e88b4..f7f604998 100644 --- a/clamav-devel/libclamav/lockdb.c +++ b/clamav-devel/libclamav/lockdb.c @@ -95,6 +95,11 @@ int cli_unlockdb(const char *dbdirpath) return CL_SUCCESS; } +int cli_freelocks(void) +{ + return CL_SUCCESS; +} + #else /* !DONT_LOCK_DBDIRS */ int cli_readlockdb(const char *dbdirpath, int wait) @@ -107,6 +112,29 @@ int cli_writelockdb(const char *dbdirpath, int wait) return cli_lockdb(dbdirpath, wait, 1); } +int cli_freelocks(void) +{ + struct dblock * lock, *nextlock, *usedlocks = NULL; + + pthread_mutex_lock(&lock_mutex); + for(lock = dblocks; lock; lock = nextlock) { + /* there might be some locks in use, eg: during a db reload, a failure can lead + * to cl_free being called */ + nextlock = lock->lock_link; + if(lock->lock_type != -1 && lock->lock_fd != -1) { + lock->lock_link = usedlocks; + usedlocks = lock; + } + else { + free(lock); + } + } + dblocks = usedlocks; + pthread_mutex_unlock(&lock_mutex); + return CL_SUCCESS; +} + + int cli_unlockdb(const char *dbdirpath) { char lock_file[NAME_MAX]; diff --git a/clamav-devel/libclamav/lockdb.h b/clamav-devel/libclamav/lockdb.h index 86fd6323a..9e4b9b1b4 100644 --- a/clamav-devel/libclamav/lockdb.h +++ b/clamav-devel/libclamav/lockdb.h @@ -23,5 +23,6 @@ int cli_writelockdb(const char *dbdirpath, int wait); int cli_readlockdb(const char *dbdirpath, int wait); int cli_unlockdb(const char *dbdirpath); +int cli_freelocks(void); #endif diff --git a/clamav-devel/libclamav/readdb.c b/clamav-devel/libclamav/readdb.c index 53c577183..03dfb2138 100644 --- a/clamav-devel/libclamav/readdb.c +++ b/clamav-devel/libclamav/readdb.c @@ -1681,6 +1681,7 @@ void cl_free(struct cl_engine *engine) if(engine->dconf) free(engine->dconf); + cli_freelocks(); free(engine); } diff --git a/clamav-devel/shared/cfgparser.c b/clamav-devel/shared/cfgparser.c index e26568a3a..d111c1677 100644 --- a/clamav-devel/shared/cfgparser.c +++ b/clamav-devel/shared/cfgparser.c @@ -138,7 +138,7 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) if(!pt->name) break; - if(regcfg(&copt, strdup(pt->name), pt->strarg ? strdup(pt->strarg) : NULL, pt->numarg, pt->multiple) < 0) { + if(regcfg(&copt, pt->name, pt->strarg ? strdup(pt->strarg) : NULL, pt->numarg, pt->multiple) < 0) { fprintf(stderr, "ERROR: Can't register new options (not enough memory)\n"); freecfg(copt); return NULL; @@ -379,6 +379,7 @@ struct cfgstruct *getcfg(const char *cfgfile, int verbose) freecfg(copt); return NULL; } + free(name); } } @@ -444,7 +445,7 @@ static int regcfg(struct cfgstruct **copt, char *optname, char *strarg, int numa if(!newnode) return -1; - newnode->optname = optname; + newnode->optname = optname ? strdup(optname) : NULL; newnode->nextarg = NULL; newnode->next = NULL; newnode->enabled = 0; @@ -470,17 +471,25 @@ static int regcfg(struct cfgstruct **copt, char *optname, char *strarg, int numa pt->nextarg = newnode; } else { + if(pt->strarg) + free(pt->strarg); pt->strarg = newnode->strarg; pt->numarg = newnode->numarg; pt->enabled = newnode->enabled; + if(newnode->optname) + free(newnode->optname); free(newnode); } return 3; /* registered additional argument */ } else { + if(pt->strarg) + free(pt->strarg); pt->strarg = newnode->strarg; pt->numarg = newnode->numarg; pt->enabled = newnode->enabled; + if(newnode->optname) + free(newnode->optname); free(newnode); return 2; }