summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjbj <jbj>2016-06-27 03:00:40 +0000
committerjbj <jbj>2016-06-27 03:00:40 +0000
commit3d6654a054a75daab61b0d3909505404ef00d2a8 (patch)
tree26ae0c5f56d202d559f48b8ee8eae85731052dae
parent9348ab09e1a92df2e248e416d1161d01a97ed2bb (diff)
downloadlibpopt-3d6654a054a75daab61b0d3909505404ef00d2a8.tar.gz
- fix: free con->os->nextArg when used (memory leaks).
- enable SUPPORT_GLOBAL_CALCULATOR. - revert to SUPPORT_CONTIGUOUS_ARGV: alias/exec have memroy leaks. - add poptGlob_pattern_p() always (portability).
-rw-r--r--CHANGES4
-rw-r--r--popt.c25
-rw-r--r--poptconfig.c6
-rw-r--r--poptint.h3
4 files changed, 21 insertions, 17 deletions
diff --git a/CHANGES b/CHANGES
index 7a81d82..bd01240 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,8 @@
1.17 -> 2.0:
+ - jbj: fix: free con->os->nextArg when used (memory leaks).
+ - jbj: enable SUPPORT_GLOBAL_CALCULATOR.
+ - jbj: revert to SUPPORT_CONTIGUOUS_ARGV: alias/exec have memroy leaks.
+ - jbj: add poptGlob_pattern_p() always (portability).
- jbj: use poptArgvFree to avoid memory leaks.
- jbj: i18n: update PO files (Translation Project).
- jbj: i18n: update PO files (Translation Project).
diff --git a/popt.c b/popt.c
index c536a17..352d685 100644
--- a/popt.c
+++ b/popt.c
@@ -254,7 +254,7 @@ void poptResetContext(poptContext con)
con->os->argb = PBM_FREE(con->os->argb);
con->os->currAlias = NULL;
con->os->nextCharArg = NULL;
- con->os->nextArg = NULL;
+ con->os->nextArg = _free(con->os->nextArg);
con->os->next = 1; /* skip argv[0] */
con->numLeftovers = 0;
@@ -733,13 +733,11 @@ expandNextArg(/*@special@*/ poptContext con, const char * s)
/*@modifies con @*/
{
const char * a = NULL;
- char *t, *te;
size_t tn = strlen(s) + 1;
+ char *t = (char*) xmalloc(tn);
+ char *te = t;
char c;
- te = t = (char*) xmalloc(tn);
-assert(t); /* XXX can't happen */
- if (t == NULL) return NULL;
*t = '\0';
while ((c = *s++) != '\0') {
switch (c) {
@@ -760,9 +758,8 @@ assert(t); /* XXX can't happen */
tn += strlen(a);
{ size_t pos = (size_t) (te - t);
- /* cppcheck-suppress memleakOnRealloc */
- t = (char*) xrealloc(t, tn);
-assert(t); /* XXX can't happen */
+ /* cppcheck-suppress memleakOnRealloc */
+ t = (char*) xrealloc(t, tn);
if (t == NULL)
return NULL;
te = stpcpy(t + pos, a);
@@ -778,7 +775,7 @@ assert(t); /* XXX can't happen */
/* If the new string is longer than needed, shorten. */
if ((t + tn) > te) {
/*@-usereleased@*/ /* XXX splint can't follow the pointers. */
- if ((te = (char*) xrealloc(t, (size_t)(te - t))) == NULL)
+ if ((te = (char*) xrealloc(t, (size_t)(te - t))) == NULL)
free(t);
t = te;
/*@=usereleased@*/
@@ -1311,16 +1308,16 @@ static int poptSaveArg(poptContext con, const struct poptOption * opt)
switch (poptArgType(opt)) {
case POPT_ARG_BITSET:
- /* XXX memory leak, application is responsible for free. */
rc = poptSaveBits(arg.ptr, opt->argInfo, con->os->nextArg);
+con->os->nextArg = _free(con->os->nextArg);
/*@switchbreak@*/ break;
case POPT_ARG_ARGV:
- /* XXX memory leak, application is responsible for free. */
rc = poptSaveString(arg.ptr, opt->argInfo, con->os->nextArg);
+con->os->nextArg = _free(con->os->nextArg);
/*@switchbreak@*/ break;
case POPT_ARG_STRING:
- /* XXX memory leak, application is responsible for free. */
- arg.argv[0] = (con->os->nextArg) ? xstrdup(con->os->nextArg) : NULL;
+ arg.argv[0] = con->os->nextArg;
+con->os->nextArg = NULL;
/*@switchbreak@*/ break;
case POPT_ARG_LONGLONG:
@@ -1390,6 +1387,7 @@ static int poptSaveArg(poptContext con, const struct poptOption * opt)
arg.shortp[0] = (short) aNUM;
/*@innerbreak@*/ break;
}
+con->os->nextArg = _free(con->os->nextArg);
} /*@switchbreak@*/ break;
case POPT_ARG_FLOAT:
@@ -1431,6 +1429,7 @@ static int poptSaveArg(poptContext con, const struct poptOption * opt)
arg.floatp[0] = (float) aDouble;
/*@innerbreak@*/ break;
}
+con->os->nextArg = _free(con->os->nextArg);
} /*@switchbreak@*/ break;
case POPT_ARG_MAINCALL:
/*@-assignexpose -type@*/
diff --git a/poptconfig.c b/poptconfig.c
index ef6c1ce..0bd3c97 100644
--- a/poptconfig.c
+++ b/poptconfig.c
@@ -42,11 +42,10 @@ extern int glob_pattern_p (const char *__pattern, int __quote)
/*@=declundef =exportheader =incondefs =protoparammatch =redecl =type @*/
#endif /* __LCLINT__ */
-#if !defined(__GLIBC__)
/* Return nonzero if PATTERN contains any metacharacters.
Metacharacters can be quoted with backslashes if QUOTE is nonzero. */
static int
-glob_pattern_p (const char * pattern, int quote)
+poptGlob_pattern_p (const char * pattern, int quote)
/*@*/
{
const char * p;
@@ -72,7 +71,6 @@ glob_pattern_p (const char * pattern, int quote)
}
return 0;
}
-#endif /* !defined(__GLIBC__) */
#if defined(HAVE_ASSERT_H)
#include <assert.h>
@@ -111,7 +109,7 @@ static int poptGlob(/*@unused@*/ UNUSED(poptContext con), const char * pattern,
pat++;
#if defined(HAVE_GLOB_H)
- if (glob_pattern_p(pat, 0)) {
+ if (poptGlob_pattern_p(pat, 0)) {
glob_t _g, *pglob = &_g;
if (!glob(pat, poptGlobFlags, poptGlob_error, pglob)) {
diff --git a/poptint.h b/poptint.h
index 45b4599..7a86ff5 100644
--- a/poptint.h
+++ b/poptint.h
@@ -11,6 +11,9 @@
#include <stdint.h>
+#define SUPPORT_GLOBAL_CALCULATOR 1
+#define SUPPORT_CONTIGUOUS_ARGV 1
+
/**
* Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
* @param p memory to free