summaryrefslogtreecommitdiff
path: root/popt.c
diff options
context:
space:
mode:
Diffstat (limited to 'popt.c')
-rw-r--r--popt.c25
1 files changed, 12 insertions, 13 deletions
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@*/