Some popt improvements:
authorWayne Davison <wayned@samba.org>
Sat, 8 Mar 2008 18:54:17 +0000 (10:54 -0800)
committerWayne Davison <wayned@samba.org>
Sat, 8 Mar 2008 19:02:40 +0000 (11:02 -0800)
- Fixed a bug in short-opt parsing when an abutting arg has an '='.
- Allow a short-opt to be separated from its arg by an '='.
- Avoid an IBM-checker warning about an impossible case in a switch
  and a warning about a potential NULL-pointer dereference.
- Fixed a memory leak.

popt/popt.c
popt/popthelp.c
popt/poptparse.c

index a2c24e7..a01b6b9 100644 (file)
@@ -809,16 +809,20 @@ int poptGetNextOpt(poptContext con)
                    *oe++ = '\0';
                    /* XXX longArg is mapped back to persistent storage. */
                    longArg = origOptString + (oe - localOptString);
-               }
+               } else
+                   oe = NULL;
 
                opt = findOption(con->options, optString, '\0', &cb, &cbData,
                                 singleDash);
                if (!opt && !singleDash)
                    return POPT_ERROR_BADOPT;
+               if (!opt && oe)
+                   oe[-1] = '='; /* restore overwritten '=' */
            }
 
            if (!opt) {
                con->os->nextCharArg = origOptString + 1;
+               longArg = NULL;
            } else {
                if (con->os == con->optionStack &&
                   opt->argInfo & POPT_ARGFLAG_STRIP)
@@ -856,7 +860,7 @@ int poptGetNextOpt(poptContext con)
 
            origOptString++;
            if (*origOptString != '\0')
-               con->os->nextCharArg = origOptString;
+               con->os->nextCharArg = origOptString + (*origOptString == '=');
        }
        /*@=branchstate@*/
 
index ba8d024..6a00976 100644 (file)
@@ -121,7 +121,7 @@ getArgDescrip(const struct poptOption * opt,
     if (opt->argDescrip) return D_(translation_domain, opt->argDescrip);
 
     switch (opt->argInfo & POPT_ARG_MASK) {
-    case POPT_ARG_NONE:                return POPT_("NONE");
+    /*case POPT_ARG_NONE:      return POPT_("NONE");*/ /* impossible */
 #ifdef DYING
     case POPT_ARG_VAL:         return POPT_("VAL");
 #else
@@ -767,6 +767,9 @@ static int showShortOptions(const struct poptOption * opt, FILE * fp,
     char * s = (str != NULL ? str : memset(alloca(300), 0, 300));
     int len = 0;
 
+    if (s == NULL)
+       return 0;
+
 /*@-boundswrite@*/
     if (opt != NULL)
     for (; (opt->longName || opt->shortName || opt->arg); opt++) {
index bb3b69d..e003a04 100644 (file)
@@ -163,8 +163,10 @@ int poptConfigFileToString(FILE *fp, char ** argstrp, /*@unused@*/ UNUSED(int fl
            p++;
 
        linelen = strlen(p);
-       if (linelen >= maxlinelen-1)
+       if (linelen >= maxlinelen-1) {
+           free(argstr);
            return POPT_ERROR_OVERFLOW; /* XXX line too long */
+       }
 
        if (*p == '\0' || *p == '\n') continue; /* line is empty */
        if (*p == '#') continue;                /* comment line */