fix memleaks

git-svn: trunk@2678
remotes/push_mirror/metadata
Tomasz Kojm 19 years ago
parent 49dca2e3cd
commit 52c3c22547
  1. 5
      clamav-devel/ChangeLog
  2. 28
      clamav-devel/libclamav/lockdb.c
  3. 1
      clamav-devel/libclamav/lockdb.h
  4. 1
      clamav-devel/libclamav/readdb.c
  5. 13
      clamav-devel/shared/cfgparser.c

@ -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

@ -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];

@ -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

@ -1681,6 +1681,7 @@ void cl_free(struct cl_engine *engine)
if(engine->dconf)
free(engine->dconf);
cli_freelocks();
free(engine);
}

@ -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;
}

Loading…
Cancel
Save