From: Wayne Davison Date: Sat, 8 Mar 2008 18:54:17 +0000 (-0800) Subject: Some popt improvements: X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/commitdiff_plain/894e6299c10e24d1745d268b465695934f4bb1a9 Some popt improvements: - 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. --- diff --git a/popt/popt.c b/popt/popt.c index a2c24e78..a01b6b96 100644 --- a/popt/popt.c +++ b/popt/popt.c @@ -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@*/ diff --git a/popt/popthelp.c b/popt/popthelp.c index ba8d0243..6a009766 100644 --- a/popt/popthelp.c +++ b/popt/popthelp.c @@ -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++) { diff --git a/popt/poptparse.c b/popt/poptparse.c index bb3b69d6..e003a04a 100644 --- a/popt/poptparse.c +++ b/popt/poptparse.c @@ -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 */