From 3d6654a054a75daab61b0d3909505404ef00d2a8 Mon Sep 17 00:00:00 2001 From: jbj Date: Mon, 27 Jun 2016 03:00:40 +0000 Subject: - 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). --- CHANGES | 4 ++++ popt.c | 25 ++++++++++++------------- poptconfig.c | 6 ++---- poptint.h | 3 +++ 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 @@ -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 +#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 -- cgit v1.2.1