[prev in list] [next in list] [prev in thread] [next in thread]
List: openbsd-tech
Subject: [patch] memory leaks in opencvs:modules.c
From: Igor Zinovik <zinovik () cs ! karelia ! ru>
Date: 2008-02-25 17:11:13
Message-ID: 20080225171112.GH8568 () kappa ! cs ! prv
[Download RAW message or body]
Hello, tech@ readers.
cvs_module_lookup() losses memory when it founds a module that is
requested. Module checkout structure `mc' is allocated when function
starts. Then it tries to find module with name `name' and if it
(function) finds it (module) memory is allocated to variable that
already hold some memory. Seems that second xmalloc() call is
redundant.
--- modules.c.orig 2008-02-25 19:43:42.000000000 +0300
+++ modules.c 2008-02-25 19:56:43.000000000 +0300
@@ -215,7 +215,6 @@ cvs_module_lookup(char *name)
TAILQ_FOREACH(mi, &modules, m_list) {
if (!strcmp(name, mi->mi_name)) {
- mc = xmalloc(sizeof(*mc));
mc->mc_modules = mi->mi_modules;
mc->mc_ignores = mi->mi_ignores;
mc->mc_canfree = 0;
Function `module_parse_line' does not free `bline' and `prog'. `bline'
holds copy of `line', but when things go bad and we leave function it
does not freed. `prog' gets memory when we are parsing `-o' or `-i'
flags. My fix is blunt. I think it is better to create some kind of
label `relase_memory' and add goto statements that will point to it, but
i personally do not like `goto'.
--- modules.c.orig 2008-02-25 19:43:42.000000000 +0300
+++ modules.c 2008-02-25 19:50:54.000000000 +0300
@@ -94,6 +94,9 @@ modules_parse_line(char *line, int linen
switch (val[1]) {
case 'a':
if (flags & MODULE_TARGETDIR) {
+ if (prog != NULL)
+ xfree(prog);
+ xfree(bline);
cvs_log(LP_NOTICE, "cannot use -a with -d");
return;
}
@@ -101,6 +104,9 @@ modules_parse_line(char *line, int linen
break;
case 'd':
if (flags & MODULE_ALIAS) {
+ if (prog != NULL)
+ xfree(prog);
+ xfree(bline);
cvs_log(LP_NOTICE, "cannot use -d with -a");
return;
}
@@ -111,6 +117,8 @@ modules_parse_line(char *line, int linen
break;
case 'o':
if (flags != 0 || prog != NULL) {
+ xfree(prog);
+ xfree(bline);
cvs_log(LP_NOTICE,
"-o cannot be used with other flags");
return;
@@ -129,6 +137,8 @@ modules_parse_line(char *line, int linen
break;
case 'i':
if (flags != 0 || prog != NULL) {
+ xfree(prog);
+ xfree(bline);
cvs_log(LP_NOTICE,
"-i cannot be used with other flags");
return;
@@ -202,6 +212,10 @@ modules_parse_line(char *line, int linen
return;
bad:
+ if (prog != NULL)
+ xfree(prog);
+ xfree(bline);
+
cvs_log(LP_NOTICE, "malformed line in CVSROOT/modules: %d", lineno);
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic