summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjbj <jbj>2011-04-19 22:42:27 +0000
committerjbj <jbj>2011-04-19 22:42:27 +0000
commit69129313616c67c759953ba2bd15c289b983c2ce (patch)
treec481ac4413829df54b88e06fae33c698b3c8e759
parenteae407b47b88e48da6b3be6c2aedbc703aa435af (diff)
downloadlibpopt-69129313616c67c759953ba2bd15c289b983c2ce.tar.gz
- fix: plug a memory leak related to contiguous argv malloc.
-rw-r--r--.cvsignore1
-rw-r--r--popt.c12
2 files changed, 9 insertions, 4 deletions
diff --git a/.cvsignore b/.cvsignore
index b192121..0573a0e 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -21,6 +21,7 @@ config.log
config.rpath
config.status
config.sub
+configmake.h
configure
doxygen
depcomp
diff --git a/popt.c b/popt.c
index 525b471..189a01f 100644
--- a/popt.c
+++ b/popt.c
@@ -1023,6 +1023,7 @@ char * te = t;
const char * s;
int rc = 0; /* assume success */
long long retval = 0;
+ int i;
const char ** av = NULL;
int ac = 0;
int xx;
@@ -1072,8 +1073,7 @@ s = (expr ? expr : t);
xx = poptParseArgvString(s, &ac, &av); /* XXX split on CSV character set. */
assert(!xx && av);
- if (av) {
- int i;
+ if (av)
for (i = 0; av[i] != NULL; i++) {
const char * arg = av[i];
size_t len = strlen(arg);
@@ -1136,7 +1136,6 @@ assert(!xx && av);
}
}
}
- }
if (ix-- < 1) {
rc = POPT_ERROR_STACKUNDERFLOW;
@@ -1145,8 +1144,13 @@ assert(!xx && av);
retval = stk[ix];
exit:
- if (av)
+ if (av) {
+#if !defined(SUPPORT_CONTIGUOUS_ARGV)
+ for (i = 0; av[i]; i++)
+ av[i] = _free(av[i]);
+#endif
av = _free(av);
+ }
*rcp = rc;
return retval;
}