From: kloczek Date: Fri, 20 Sep 2002 09:36:13 +0000 (+0000) Subject: - outdated. X-Git-Tag: rpm-4_0_2-92~3 X-Git-Url: http://git.pld-linux.org/?p=packages%2Frpm.git;a=commitdiff_plain;h=3f5d08e40f8f4fd5b7ce8131012322eb9c70d252 - outdated. Changed files: popt-cvs20010530.patch -> 1.3 --- diff --git a/popt-cvs20010530.patch b/popt-cvs20010530.patch deleted file mode 100644 index f90d0df..0000000 --- a/popt-cvs20010530.patch +++ /dev/null @@ -1,2105 +0,0 @@ ---- rpm-4.0.2/popt/Makefile.am.wiget Tue Apr 25 22:14:21 2000 -+++ rpm-4.0.2/popt/Makefile.am Wed May 30 14:12:30 2001 -@@ -34,6 +34,10 @@ - - man_MANS = popt.3 - -+.PHONY: sources -+sources: -+ @echo $(libpopt_la_SOURCES:%=popt/%) -+ - .PHONY: lclint - lclint: - lclint ${DEFS} ${INCLUDES} ${libpopt_la_SOURCES} ---- rpm-4.0.2/popt/findme.c.wiget Tue Dec 19 23:25:15 2000 -+++ rpm-4.0.2/popt/findme.c Wed May 30 14:12:30 2001 -@@ -15,14 +15,16 @@ - char * start, * chptr; - char * buf; - -+ if (argv0 == NULL) return NULL; /* XXX can't happen */ - /* If there is a / in the argv[0], it has to be an absolute path */ - if (strchr(argv0, '/')) - return xstrdup(argv0); - -- if (!path) return NULL; -+ if (path == NULL) return NULL; - - start = pathbuf = alloca(strlen(path) + 1); - buf = malloc(strlen(path) + strlen(argv0) + sizeof("/")); -+ if (buf == NULL) return NULL; /* XXX can't happen */ - strcpy(pathbuf, path); - - chptr = NULL; ---- rpm-4.0.2/popt/findme.h.wiget Tue Jan 2 18:25:32 2001 -+++ rpm-4.0.2/popt/findme.h Wed May 30 14:12:30 2001 -@@ -14,6 +14,6 @@ - * @param argv0 name of executable - * @return (malloc'd) absolute path to executable (or NULL) - */ --/*@null@*/ const char * findProgramPath(const char * argv0); -+/*@null@*/ const char * findProgramPath(/*@null@*/ const char * argv0); - - #endif ---- rpm-4.0.2/popt/missing.wiget Thu Oct 8 16:23:56 1998 -+++ rpm-4.0.2/popt/missing Wed May 30 14:12:30 2001 -@@ -1,7 +1,7 @@ - #! /bin/sh - # Common stub for a few missing GNU programs while installing. --# Copyright (C) 1996, 1997 Free Software Foundation, Inc. --# Franc,ois Pinard , 1996. -+# Copyright 1996, 1997, 1999, 2000 Free Software Foundation, Inc. -+# Originally by Fran,cois Pinard , 1996. - - # This program is free software; you can redistribute it and/or modify - # it under the terms of the GNU General Public License as published by -@@ -23,6 +23,19 @@ - exit 1 - fi - -+run=: -+ -+case "$1" in -+--run) -+ # Try to run requested program, and just exit if it succeeds. -+ run= -+ shift -+ "$@" && exit 0 -+ ;; -+esac -+ -+# If it does not exist, or fails to run (possibly an outdated version), -+# try to emulate it. - case "$1" in - - -h|--h|--he|--hel|--help) -@@ -35,6 +48,7 @@ - Options: - -h, --help display this help and exit - -v, --version output version information and exit -+ --run try to run the given command, and emulate it if it fails - - Supported PROGRAM values: - aclocal touch file \`aclocal.m4' -@@ -43,13 +57,15 @@ - automake touch all \`Makefile.in' files - bison create \`y.tab.[ch]', if possible, from existing .[ch] - flex create \`lex.yy.c', if possible, from existing .c -+ help2man touch the output file - lex create \`lex.yy.c', if possible, from existing .c - makeinfo touch the output file -+ tar try tar, gnutar, gtar, then tar without non-portable flags - yacc create \`y.tab.[ch]', if possible, from existing .[ch]" - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) -- echo "missing - GNU libit 0.0" -+ echo "missing 0.3 - GNU automake" - ;; - - -*) -@@ -82,15 +98,17 @@ - you modified \`acconfig.h' or \`configure.in'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." -- files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER([^):]*:\([^)]*\)).*/\1/p' configure.in` -- if test -z "$files"; then -- files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^):]*\)).*/\1/p' configure.in` -- test -z "$files" || files="$files.in" -- else -- files=`echo "$files" | sed -e 's/:/ /g'` -- fi -- test -z "$files" && files="config.h.in" -- touch $files -+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' configure.in` -+ test -z "$files" && files="config.h" -+ touch_files= -+ for f in $files; do -+ case "$f" in -+ *:*) touch_files="$touch_files "`echo "$f" | -+ sed -e 's/^[^:]*://' -e 's/:.*//'`;; -+ *) touch_files="$touch_files $f.in";; -+ esac -+ done -+ touch $touch_files - ;; - - automake) -@@ -99,9 +117,9 @@ - you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." -- find . -type f -name Makefile.am -print \ -- | sed 's/^\(.*\).am$/touch \1.in/' \ -- | sh -+ find . -type f -name Makefile.am -print | -+ sed 's/\.am$/.in/' | -+ while read f; do touch "$f"; done - ;; - - bison|yacc) -@@ -157,6 +175,26 @@ - fi - ;; - -+ help2man) -+ echo 1>&2 "\ -+WARNING: \`$1' is missing on your system. You should only need it if -+ you modified a dependency of a manual page. You may need the -+ \`Help2man' package in order for those modifications to take -+ effect. You can get \`Help2man' from any GNU archive site." -+ -+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` -+ if test -z "$file"; then -+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` -+ fi -+ if [ -f "$file" ]; then -+ touch $file -+ else -+ test -z "$file" || exec >$file -+ echo ".ab help2man is required to generate this page" -+ exit 1 -+ fi -+ ;; -+ - makeinfo) - echo 1>&2 "\ - WARNING: \`$1' is missing on your system. You should only need it if -@@ -171,6 +209,45 @@ - file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` - fi - touch $file -+ ;; -+ -+ tar) -+ shift -+ if test -n "$run"; then -+ echo 1>&2 "ERROR: \`tar' requires --run" -+ exit 1 -+ fi -+ -+ # We have already tried tar in the generic part. -+ # Look for gnutar/gtar before invocation to avoid ugly error -+ # messages. -+ if (gnutar --version > /dev/null 2>&1); then -+ gnutar ${1+"$@"} && exit 0 -+ fi -+ if (gtar --version > /dev/null 2>&1); then -+ gtar ${1+"$@"} && exit 0 -+ fi -+ firstarg="$1" -+ if shift; then -+ case "$firstarg" in -+ *o*) -+ firstarg=`echo "$firstarg" | sed s/o//` -+ tar "$firstarg" ${1+"$@"} && exit 0 -+ ;; -+ esac -+ case "$firstarg" in -+ *h*) -+ firstarg=`echo "$firstarg" | sed s/h//` -+ tar "$firstarg" ${1+"$@"} && exit 0 -+ ;; -+ esac -+ fi -+ -+ echo 1>&2 "\ -+WARNING: I can't seem to be able to run \`tar' with the given arguments. -+ You may want to install GNU tar or Free paxutils, or check the -+ command line arguments." -+ exit 1 - ;; - - *) ---- rpm-4.0.2/popt/popt.3.wiget Wed Feb 7 18:56:53 2001 -+++ rpm-4.0.2/popt/popt.3 Wed May 30 14:12:34 2001 -@@ -757,4 +757,4 @@ - .sp - .BR popt.ps " is a Postscript version of the above cited book " - chapter. It can be found in the source archive for popt available at: --ftp://ftp.redhat.com/pub/redhat/code/popt -+ftp://ftp.rpm.org/pub/rpm. ---- rpm-4.0.2/popt/popt.c.wiget Tue Jan 16 13:53:13 2001 -+++ rpm-4.0.2/popt/popt.c Wed May 30 14:12:34 2001 -@@ -30,21 +30,41 @@ - } - #endif - --void poptSetExecPath(poptContext con, const char * path, int allowAbsolute) { -- if (con->execPath) free((void *)con->execPath); -+#ifdef MYDEBUG -+/*@unused@*/ static void prtcon(const char *msg, poptContext con) -+{ -+ if (msg) fprintf(stderr, "%s", msg); -+ fprintf(stderr, "\tcon %p os %p nextCharArg \"%s\" nextArg \"%s\" argv[%d] \"%s\"\n", -+ con, con->os, -+ (con->os->nextCharArg ? con->os->nextCharArg : ""), -+ (con->os->nextArg ? con->os->nextArg : ""), -+ con->os->next, -+ (con->os->argv && con->os->argv[con->os->next] -+ ? con->os->argv[con->os->next] : "")); -+} -+#endif -+ -+void poptSetExecPath(poptContext con, const char * path, int allowAbsolute) -+{ -+ con->execPath = _free(con->execPath); - con->execPath = xstrdup(path); - con->execAbsolute = allowAbsolute; - } - - static void invokeCallbacksPRE(poptContext con, const struct poptOption * opt) -+ /*@modifies internalState@*/ - { -+ if (opt != NULL) - for (; opt->longName || opt->shortName || opt->arg; opt++) { -+ if (opt->arg == NULL) continue; /* XXX program error. */ - if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) { - /* Recurse on included sub-tables. */ - invokeCallbacksPRE(con, opt->arg); - } else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK && - (opt->argInfo & POPT_CBFLAG_PRE)) -- { poptCallbackType cb = (poptCallbackType)opt->arg; -+ { /*@-castfcnptr@*/ -+ poptCallbackType cb = (poptCallbackType)opt->arg; -+ /*@=castfcnptr@*/ - /* Perform callback. */ - cb(con, POPT_CALLBACK_REASON_PRE, NULL, NULL, opt->descrip); - } -@@ -52,14 +72,19 @@ - } - - static void invokeCallbacksPOST(poptContext con, const struct poptOption * opt) -+ /*@modifies internalState@*/ - { -+ if (opt != NULL) - for (; opt->longName || opt->shortName || opt->arg; opt++) { -+ if (opt->arg == NULL) continue; /* XXX program error. */ - if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) { - /* Recurse on included sub-tables. */ - invokeCallbacksPOST(con, opt->arg); - } else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK && - (opt->argInfo & POPT_CBFLAG_POST)) -- { poptCallbackType cb = (poptCallbackType)opt->arg; -+ { /*@-castfcnptr@*/ -+ poptCallbackType cb = (poptCallbackType)opt->arg; -+ /*@=castfcnptr@*/ - /* Perform callback. */ - cb(con, POPT_CALLBACK_REASON_POST, NULL, NULL, opt->descrip); - } -@@ -69,14 +94,17 @@ - static void invokeCallbacksOPTION(poptContext con, - const struct poptOption * opt, - const struct poptOption * myOpt, -- const void * myData, int shorty) -+ /*@null@*/ const void * myData, int shorty) -+ /*@modifies internalState@*/ - { - const struct poptOption * cbopt = NULL; - -+ if (opt != NULL) - for (; opt->longName || opt->shortName || opt->arg; opt++) { - if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) { - /* Recurse on included sub-tables. */ -- invokeCallbacksOPTION(con, opt->arg, myOpt, myData, shorty); -+ if (opt->arg != NULL) /* XXX program error */ -+ invokeCallbacksOPTION(con, opt->arg, myOpt, myData, shorty); - } else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK && - !(opt->argInfo & POPT_CBFLAG_SKIPOPTION)) { - /* Save callback info. */ -@@ -85,13 +113,19 @@ - ((myOpt->shortName && opt->shortName && shorty && - myOpt->shortName == opt->shortName) || - (myOpt->longName && opt->longName && -+ /*@-nullpass@*/ /* LCL: opt->longName != NULL */ - !strcmp(myOpt->longName, opt->longName))) -+ /*@=nullpass@*/ - ) -- { poptCallbackType cb = (poptCallbackType)cbopt->arg; -+ { /*@-castfcnptr@*/ -+ poptCallbackType cb = (poptCallbackType)cbopt->arg; -+ /*@=castfcnptr@*/ - const void * cbData = (cbopt->descrip ? cbopt->descrip : myData); - /* Perform callback. */ -- cb(con, POPT_CALLBACK_REASON_OPTION, myOpt, -+ if (cb != NULL) { /* XXX program error */ -+ cb(con, POPT_CALLBACK_REASON_OPTION, myOpt, - con->os->nextArg, cbData); -+ } - /* Terminate (unless explcitly continuing). */ - if (!(cbopt->argInfo & POPT_CBFLAG_CONTINUE)) - return; -@@ -104,18 +138,23 @@ - { - poptContext con = malloc(sizeof(*con)); - -+ if (con == NULL) return NULL; /* XXX can't happen */ - memset(con, 0, sizeof(*con)); - - con->os = con->optionStack; - con->os->argc = argc; -+ /*@-dependenttrans@*/ /* FIX: W2DO? */ - con->os->argv = argv; -+ /*@=dependenttrans@*/ - con->os->argb = NULL; - - if (!(flags & POPT_CONTEXT_KEEP_FIRST)) - con->os->next = 1; /* skip argv[0] */ - - con->leftovers = calloc( (argc + 1), sizeof(char *) ); -+ /*@-dependenttrans@*/ /* FIX: W2DO? */ - con->options = options; -+ /*@=dependenttrans@*/ - con->aliases = NULL; - con->numAliases = 0; - con->flags = flags; -@@ -129,40 +168,34 @@ - if (getenv("POSIXLY_CORRECT") || getenv("POSIX_ME_HARDER")) - con->flags |= POPT_CONTEXT_POSIXMEHARDER; - -- if (name) -- con->appName = strcpy(malloc(strlen(name) + 1), name); -+ if (name) { -+ char * t = malloc(strlen(name) + 1); -+ if (t) con->appName = strcpy(t, name); -+ } - - invokeCallbacksPRE(con, con->options); - - return con; - } - --static void cleanOSE(struct optionStackEntry *os) -+static void cleanOSE(/*@special@*/ struct optionStackEntry *os) -+ /*@uses os @*/ -+ /*@releases os->nextArg, os->argv, os->argb @*/ - { -- if (os->nextArg) { -- free((void *)os->nextArg); -- os->nextArg = NULL; -- } -- if (os->argv) { -- free((void *)os->argv); -- os->argv = NULL; -- } -- if (os->argb) { -- PBM_FREE(os->argb); -- os->argb = NULL; -- } -+ os->nextArg = _free(os->nextArg); -+ os->argv = _free(os->argv); -+ os->argb = PBM_FREE(os->argb); - } - --void poptResetContext(poptContext con) { -+void poptResetContext(poptContext con) -+{ - int i; - -+ if (con == NULL) return; - while (con->os > con->optionStack) { - cleanOSE(con->os--); - } -- if (con->os->argb) { -- PBM_FREE(con->os->argb); -- con->os->argb = NULL; -- } -+ con->os->argb = PBM_FREE(con->os->argb); - con->os->currAlias = NULL; - con->os->nextCharArg = NULL; - con->os->nextArg = NULL; -@@ -173,25 +206,29 @@ - con->restLeftover = 0; - con->doExec = NULL; - -- for (i = 0; i < con->finalArgvCount; i++) { -- if (con->finalArgv[i]) { -- free((void *)con->finalArgv[i]); -- con->finalArgv[i] = NULL; -- } -- } -+ if (con->finalArgv != NULL) -+ for (i = 0; i < con->finalArgvCount; i++) -+ /*@-unqualifiedtrans@*/ /* FIX: typedef double indirection. */ -+ con->finalArgv[i] = _free(con->finalArgv[i]); -+ /*@=unqualifiedtrans@*/ - - con->finalArgvCount = 0; -- -- if (con->arg_strip) { -- PBM_FREE(con->arg_strip); -- con->arg_strip = NULL; -- } -+ con->arg_strip = PBM_FREE(con->arg_strip); -+ /*@-nullstate@*/ /* FIX: con->finalArgv != NULL */ -+ return; -+ /*@=nullstate@*/ - } - --/* Only one of longName, shortName may be set at a time */ --static int handleExec(poptContext con, char * longName, char shortName) { -+/* Only one of longName, shortName should be set, not both. */ -+static int handleExec(/*@special@*/ poptContext con, -+ /*@null@*/ const char * longName, char shortName) -+ /*@uses con->execs, con->numExecs, con->flags, con->doExec, -+ con->finalArgv, con->finalArgvAlloced, con->finalArgvCount @*/ -+{ - int i; - -+ if (con->execs == NULL || con->numExecs <= 0) /* XXX can't happen */ -+ return 0; - i = con->numExecs - 1; - if (longName) { - while (i >= 0 && (!con->execs[i].longName || -@@ -220,29 +257,44 @@ - } - - i = con->finalArgvCount++; -+ if (con->finalArgv != NULL) /* XXX can't happen */ - { char *s = malloc((longName ? strlen(longName) : 0) + 3); -- if (longName) -- sprintf(s, "--%s", longName); -- else -- sprintf(s, "-%c", shortName); -- con->finalArgv[i] = s; -+ if (s != NULL) { /* XXX can't happen */ -+ if (longName) -+ sprintf(s, "--%s", longName); -+ else -+ sprintf(s, "-%c", shortName); -+ con->finalArgv[i] = s; -+ } else -+ con->finalArgv[i] = NULL; - } - -+ /*@-nullstate@*/ /* FIX: con->finalArgv[] == NULL */ - return 1; -+ /*@=nullstate@*/ - } - - /* Only one of longName, shortName may be set at a time */ --static int handleAlias(poptContext con, const char * longName, char shortName, -- /*@keep@*/ const char * nextCharArg) { -+static int handleAlias(/*@special@*/ poptContext con, -+ /*@null@*/ const char * longName, char shortName, -+ /*@keep@*/ /*@null@*/ const char * nextCharArg) -+ /*@uses con->aliases, con->numAliases, con->optionStack, -+ con->os, con->os->currAlias, con->os->currAlias->longName @*/ -+{ -+ int rc; - int i; - - if (con->os->currAlias && con->os->currAlias->longName && longName && -+ /*@-nullpass@*/ /* LCL: con->os->currAlias->longName != NULL */ - !strcmp(con->os->currAlias->longName, longName)) -+ /*@=nullpass@*/ - return 0; - if (con->os->currAlias && shortName && - shortName == con->os->currAlias->shortName) - return 0; - -+ if (con->aliases == NULL || con->numAliases <= 0) /* XXX can't happen */ -+ return 0; - i = con->numAliases - 1; - if (longName) { - while (i >= 0 && (!con->aliases[i].longName || -@@ -266,27 +318,34 @@ - con->os->nextArg = NULL; - con->os->nextCharArg = NULL; - con->os->currAlias = con->aliases + i; -- poptDupArgv(con->os->currAlias->argc, con->os->currAlias->argv, -+ rc = poptDupArgv(con->os->currAlias->argc, con->os->currAlias->argv, - &con->os->argc, &con->os->argv); - con->os->argb = NULL; - -- return 1; -+ return (rc ? rc : 1); - } - --static void execCommand(poptContext con) { -+static int execCommand(poptContext con) -+ /*@modifies fileSystem @*/ -+{ - const char ** argv; - int argc = 0; - const char ** sargv; - int sargc = 0; -+ int rc; - -- poptParseArgvString(con->doExec->script, &sargc, &sargv); -+ if (con->doExec == NULL || con->doExec->script == NULL) /*XXX can't happen*/ -+ return POPT_ERROR_NOARG; -+ rc = poptParseArgvString(con->doExec->script, &sargc, &sargv); -+ if (rc) return rc; - - if (sargv == NULL || sargc < 1 || - (!con->execAbsolute && strchr(sargv[0], '/'))) -- return; -+ return POPT_ERROR_NOARG; - - argv = malloc(sizeof(*argv) * - (6 + sargc + con->numLeftovers + con->finalArgvCount)); -+ if (argv == NULL) return POPT_ERROR_MALLOC; /* XXX can't happen */ - - if (!strchr(sargv[0], '/') && con->execPath) { - char *s = alloca(strlen(con->execPath) + strlen(sargv[0]) + sizeof("/")); -@@ -295,26 +354,31 @@ - } else { - argv[argc] = findProgramPath(sargv[0]); - } -- if (argv[argc++] == NULL) return; -+ if (argv[argc++] == NULL) return POPT_ERROR_NOARG; - - if (sargc > 1) { - memcpy(argv + argc, sargv + 1, sizeof(*argv) * (sargc - 1)); - argc += (sargc - 1); - } - -- memcpy(argv + argc, con->finalArgv, sizeof(*argv) * con->finalArgvCount); -- argc += con->finalArgvCount; -+ if (con->finalArgv != NULL && con->finalArgvCount > 0) { -+ memcpy(argv + argc, con->finalArgv, -+ sizeof(*argv) * con->finalArgvCount); -+ argc += con->finalArgvCount; -+ } - -- if (con->numLeftovers) { -+ if (con->leftovers != NULL && con->numLeftovers > 0) { -+#if 0 - argv[argc++] = "--"; -+#endif - memcpy(argv + argc, con->leftovers, sizeof(*argv) * con->numLeftovers); - argc += con->numLeftovers; - } - -- argv[argc++] = NULL; -+ argv[argc] = NULL; - - #ifdef __hpux -- setresuid(getuid(), getuid(),-1); -+ (void) setresuid(getuid(), getuid(),-1); - #else - /* - * XXX " ... on BSD systems setuid() should be preferred over setreuid()" -@@ -322,58 +386,68 @@ - * XXX from Norbert Warmuth - */ - #if defined(HAVE_SETUID) -- setuid(getuid()); -+ (void) setuid(getuid()); - #elif defined (HAVE_SETREUID) -- setreuid(getuid(), getuid()); /*hlauer: not portable to hpux9.01 */ -+ (void) setreuid(getuid(), getuid()); /*hlauer: not portable to hpux9.01 */ - #else - ; /* Can't drop privileges */ - #endif - #endif - - if (argv[0] == NULL) -- return; -+ return POPT_ERROR_NOARG; - #ifdef MYDEBUG -- { const char ** arg; -- fprintf(stderr, "==> execvp(%s):", argv[0]); -- for (arg = argv; *arg; arg++) -- fprintf(stderr, " %s", *arg); -+ { const char ** avp; -+ fprintf(stderr, "==> execvp(%s) argv[%d]:", argv[0], argc); -+ for (avp = argv; *avp; avp++) -+ fprintf(stderr, " '%s'", *avp); - fprintf(stderr, "\n"); - } - #endif - -- execvp(argv[0], (char *const *)argv); -+ (void) execvp(argv[0], (char *const *)argv); -+ return POPT_ERROR_ERRNO; - } - --/*@observer@*/ static const struct poptOption * --findOption(const struct poptOption * opt, const char * longName, -- char shortName, -- /*@out@*/ poptCallbackType * callback, /*@out@*/ const void ** callbackData, -- int singleDash) -+/*@observer@*/ /*@null@*/ static const struct poptOption * -+findOption(const struct poptOption * opt, /*@null@*/ const char * longName, -+ char shortName, -+ /*@null@*/ /*@out@*/ poptCallbackType * callback, -+ /*@null@*/ /*@out@*/ const void ** callbackData, -+ int singleDash) -+ /*@modifies *callback, *callbackData */ - { - const struct poptOption * cb = NULL; - - /* This happens when a single - is given */ -- if (singleDash && !shortName && !*longName) -+ if (singleDash && !shortName && (longName && *longName == '\0')) - shortName = '-'; - - for (; opt->longName || opt->shortName || opt->arg; opt++) { - - if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) { - const struct poptOption * opt2; -+ - /* Recurse on included sub-tables. */ -+ if (opt->arg == NULL) continue; /* XXX program error */ - opt2 = findOption(opt->arg, longName, shortName, callback, - callbackData, singleDash); -- if (opt2) { -- /* Sub-table data will be inheirited if no data yet. */ -- if (*callback && *callbackData == NULL) -- *callbackData = opt->descrip; -- return opt2; -- } -+ if (opt2 == NULL) continue; -+ /* Sub-table data will be inheirited if no data yet. */ -+ if (!(callback && *callback)) return opt2; -+ if (!(callbackData && *callbackData == NULL)) return opt2; -+ /*@-observertrans -dependenttrans @*/ -+ *callbackData = opt->descrip; -+ /*@=observertrans =dependenttrans @*/ -+ return opt2; - } else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK) { - cb = opt; - } else if (longName && opt->longName && - (!singleDash || (opt->argInfo & POPT_ARGFLAG_ONEDASH)) && -- !strcmp(longName, opt->longName)) { -+ /*@-nullpass@*/ /* LCL: opt->longName != NULL */ -+ !strcmp(longName, opt->longName)) -+ /*@=nullpass@*/ -+ { - break; - } else if (shortName && shortName == opt->shortName) { - break; -@@ -382,18 +456,30 @@ - - if (!opt->longName && !opt->shortName) - return NULL; -- *callbackData = NULL; -- *callback = NULL; -+ /*@-modobserver -mods @*/ -+ if (callback) *callback = NULL; -+ if (callbackData) *callbackData = NULL; - if (cb) { -- *callback = (poptCallbackType)cb->arg; -- if (!(cb->argInfo & POPT_CBFLAG_INC_DATA)) -- *callbackData = cb->descrip; -+ if (callback) -+ /*@-castfcnptr@*/ -+ *callback = (poptCallbackType)cb->arg; -+ /*@=castfcnptr@*/ -+ if (!(cb->argInfo & POPT_CBFLAG_INC_DATA)) { -+ if (callbackData) -+ /*@-observertrans@*/ /* FIX: typedef double indirection. */ -+ *callbackData = cb->descrip; -+ /*@=observertrans@*/ -+ } - } -+ /*@=modobserver =mods @*/ - - return opt; - } - --static const char *findNextArg(poptContext con, unsigned argx, int delete) -+static const char * findNextArg(/*@special@*/ poptContext con, -+ unsigned argx, int delete) -+ /*@uses con->optionStack, con->os, -+ con->os->next, con->os->argb, con->os->argc, con->os->argv @*/ - { - struct optionStackEntry * os = con->os; - const char * arg; -@@ -403,6 +489,7 @@ - arg = NULL; - while (os->next == os->argc && os > con->optionStack) os--; - if (os->next == os->argc && os == con->optionStack) break; -+ if (os->argv != NULL) - for (i = os->next; i < os->argc; i++) { - if (os->argb && PBM_ISSET(i, os->argb)) continue; - if (*os->argv[i] == '-') continue; -@@ -410,6 +497,7 @@ - arg = os->argv[i]; - if (delete) { - if (os->argb == NULL) os->argb = PBM_ALLOC(os->argc); -+ if (os->argb != NULL) /* XXX can't happen */ - PBM_SET(i, os->argb); - } - break; -@@ -419,15 +507,20 @@ - return arg; - } - --static /*@only@*/ const char * expandNextArg(poptContext con, const char * s) -+static /*@only@*/ /*@null@*/ const char * -+expandNextArg(/*@special@*/ poptContext con, const char * s) -+ /*@uses con->optionStack, con->os, -+ con->os->next, con->os->argb, con->os->argc, con->os->argv @*/ -+ /*@modifies con @*/ - { -- const char *a; -+ const char * a = NULL; - size_t alen; - char *t, *te; - size_t tn = strlen(s) + 1; - char c; - - te = t = malloc(tn);; -+ if (t == NULL) return NULL; /* XXX can't happen */ - while ((c = *s++) != '\0') { - switch (c) { - #if 0 /* XXX can't do this */ -@@ -438,8 +531,10 @@ - case '!': - if (!(s[0] == '#' && s[1] == ':' && s[2] == '+')) - break; -- if ((a = findNextArg(con, 1, 1)) == NULL) -- break; -+ /* XXX Make sure that findNextArg deletes only next arg. */ -+ if (a == NULL) { -+ if ((a = findNextArg(con, 1, 1)) == NULL) break; -+ } - s += 3; - - alen = strlen(a); -@@ -456,18 +551,25 @@ - *te++ = c; - } - *te = '\0'; -- t = realloc(t, strlen(t)+1); /* XXX memory leak, hard to plug */ -+ t = realloc(t, strlen(t) + 1); /* XXX memory leak, hard to plug */ - return t; - } - - static void poptStripArg(poptContext con, int which) -+ /*@modifies con @*/ - { - if (con->arg_strip == NULL) - con->arg_strip = PBM_ALLOC(con->optionStack[0].argc); -+ if (con->arg_strip != NULL) /* XXX can't happen */ - PBM_SET(which, con->arg_strip); - } - --static int poptSaveLong(const struct poptOption * opt, long aLong) { -+static int poptSaveLong(const struct poptOption * opt, long aLong) -+ /*@modifies opt->arg @*/ -+{ -+ if (opt->arg == NULL) -+ return POPT_ERROR_NULLARG; -+ - if (opt->argInfo & POPT_ARGFLAG_NOT) - aLong = ~aLong; - switch (opt->argInfo & POPT_ARGFLAG_LOGICALOPS) { -@@ -485,12 +587,17 @@ - break; - default: - return POPT_ERROR_BADOPERATION; -- break; -+ /*@notreached@*/ break; - } - return 0; - } - --static int poptSaveInt(const struct poptOption * opt, long aLong) { -+static int poptSaveInt(const struct poptOption * opt, long aLong) -+ /*@modifies opt->arg @*/ -+{ -+ if (opt->arg == NULL) -+ return POPT_ERROR_NULLARG; -+ - if (opt->argInfo & POPT_ARGFLAG_NOT) - aLong = ~aLong; - switch (opt->argInfo & POPT_ARGFLAG_LOGICALOPS) { -@@ -508,31 +615,19 @@ - break; - default: - return POPT_ERROR_BADOPERATION; -- break; -+ /*@notreached@*/ break; - } - return 0; - } - --#ifdef MYDEBUG --static void prtcon(const char *msg, poptContext con) --{ -- if (msg) fprintf(stderr, "%s", msg); -- fprintf(stderr, "\tcon %p os %p nextCharArg \"%s\" nextArg \"%s\" argv[%d] \"%s\"\n", -- con, con->os, -- (con->os->nextCharArg ? con->os->nextCharArg : ""), -- (con->os->nextArg ? con->os->nextArg : ""), -- con->os->next, -- (con->os->argv && con->os->argv[con->os->next] -- ? con->os->argv[con->os->next] : "")); --} --#endif -- - /* returns 'val' element, -1 on last item, POPT_ERROR_* on error */ - int poptGetNextOpt(poptContext con) - { - const struct poptOption * opt = NULL; - int done = 0; - -+ if (con == NULL) -+ return -1; - while (!done) { - const char * origOptString = NULL; - poptCallbackType cb = NULL; -@@ -547,7 +642,7 @@ - } - if (!con->os->nextCharArg && con->os->next == con->os->argc) { - invokeCallbacksPOST(con, con->options); -- if (con->doExec) execCommand(con); -+ if (con->doExec) return execCommand(con); - return -1; - } - -@@ -561,9 +656,14 @@ - continue; - } - thisopt = con->os->next; -+ if (con->os->argv != NULL) /* XXX can't happen */ - origOptString = con->os->argv[con->os->next++]; - -+ if (origOptString == NULL) /* XXX can't happen */ -+ return POPT_ERROR_BADOPT; -+ - if (con->restLeftover || *origOptString != '-') { -+ if (con->leftovers != NULL) /* XXX can't happen */ - con->leftovers[con->numLeftovers++] = origOptString; - if (con->flags & POPT_CONTEXT_POSIXMEHARDER) - con->restLeftover = 1; -@@ -572,10 +672,9 @@ - - /* Make a copy we can hack at */ - localOptString = optString = -- strcpy(alloca(strlen(origOptString) + 1), -- origOptString); -+ strcpy(alloca(strlen(origOptString) + 1), origOptString); - -- if (!optString[0]) -+ if (optString[0] == '\0') - return POPT_ERROR_BADOPT; - - if (optString[1] == '-' && !optString[2]) { -@@ -594,6 +693,7 @@ - /* XXX aliases with arg substitution need "--alias=arg" */ - if (handleAlias(con, optString, '\0', NULL)) - continue; -+ - if (handleExec(con, optString, '\0')) - continue; - -@@ -616,7 +716,8 @@ - con->os->nextCharArg = origOptString + 1; - } else { - if (con->os == con->optionStack && -- opt->argInfo & POPT_ARGFLAG_STRIP) { -+ opt->argInfo & POPT_ARGFLAG_STRIP) -+ { - canstrip = 1; - poptStripArg(con, thisopt); - } -@@ -630,14 +731,14 @@ - - con->os->nextCharArg = NULL; - -- if (handleAlias(con, NULL, *origOptString, -- origOptString + 1)) { -+ if (handleAlias(con, NULL, *origOptString, origOptString + 1)) - continue; -- } -+ - if (handleExec(con, NULL, *origOptString)) { - /* Restore rest of short options for further processing */ - origOptString++; -- if (*origOptString) con->os->nextCharArg = origOptString; -+ if (*origOptString != '\0') -+ con->os->nextCharArg = origOptString; - continue; - } - -@@ -648,9 +749,13 @@ - shorty = 1; - - origOptString++; -- if (*origOptString) con->os->nextCharArg = origOptString; -+ /*@-branchstate@*/ /* FIX: W2DO? */ -+ if (*origOptString != '\0') -+ con->os->nextCharArg = origOptString; -+ /*@=branchstate@*/ - } - -+ if (opt == NULL) return POPT_ERROR_BADOPT; /* XXX can't happen */ - if (opt->arg && (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_NONE) { - if (poptSaveInt(opt, 1L)) - return POPT_ERROR_BADOPERATION; -@@ -660,14 +765,15 @@ - return POPT_ERROR_BADOPERATION; - } - } else if ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) { -- if (con->os->nextArg) { -- free((void *)con->os->nextArg); -- con->os->nextArg = NULL; -- } -+ con->os->nextArg = _free(con->os->nextArg); -+ /*@-usedef@*/ /* FIX: W2DO? */ - if (longArg) { -- con->os->nextArg = expandNextArg(con, longArg); -+ /*@=usedef@*/ -+ longArg = expandNextArg(con, longArg); -+ con->os->nextArg = longArg; - } else if (con->os->nextCharArg) { -- con->os->nextArg = expandNextArg(con, con->os->nextCharArg); -+ longArg = expandNextArg(con, con->os->nextCharArg); -+ con->os->nextArg = longArg; - con->os->nextCharArg = NULL; - } else { - while (con->os->next == con->os->argc && -@@ -681,17 +787,25 @@ - return POPT_ERROR_NOARG; - } else { - -- /* make sure this isn't part of a short arg or the -- result of an alias expansion */ -+ /* -+ * Make sure this isn't part of a short arg or the -+ * result of an alias expansion. -+ */ - if (con->os == con->optionStack && -- opt->argInfo & POPT_ARGFLAG_STRIP && -+ (opt->argInfo & POPT_ARGFLAG_STRIP) && - canstrip) { - poptStripArg(con, con->os->next); - } - -- con->os->nextArg = expandNextArg(con, con->os->argv[con->os->next++]); -+ if (con->os->argv != NULL) { /* XXX can't happen */ -+ /* XXX watchout: subtle side-effects live here. */ -+ longArg = con->os->argv[con->os->next++]; -+ longArg = expandNextArg(con, longArg); -+ con->os->nextArg = longArg; -+ } - } - } -+ longArg = NULL; - - if (opt->arg) { - switch (opt->argInfo & POPT_ARG_MASK) { -@@ -731,32 +845,31 @@ - char *end; - - if (con->os->nextArg) { -+ int saveerrno = errno; -+ errno = 0; - aDouble = strtod(con->os->nextArg, &end); -- if (*end) -+ if (errno == ERANGE) -+ return POPT_ERROR_OVERFLOW; -+ errno = saveerrno; -+ if (*end != '\0') - return POPT_ERROR_BADNUMBER; - } - -- if (aDouble == +HUGE_VAL || aDouble == -HUGE_VAL) -- return POPT_ERROR_OVERFLOW; -- if (aDouble == 0.0 && errno == ERANGE) -- return POPT_ERROR_OVERFLOW; - if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_DOUBLE) { - *((double *) opt->arg) = aDouble; - } else { --#ifdef ABS --#undef ABS --#endif --#define ABS(a) (((a) < 0) ? -(a) : (a)) -- if (ABS(aDouble) > FLT_MAX) -+#define _ABS(a) ((((a) - 0.0) < DBL_EPSILON) ? -(a) : (a)) -+ if ((_ABS(aDouble) - FLT_MAX) > DBL_EPSILON) - return POPT_ERROR_OVERFLOW; -- if (ABS(aDouble) < FLT_MIN) -+ if ((FLT_MIN - _ABS(aDouble)) > DBL_EPSILON) - return POPT_ERROR_OVERFLOW; - *((float *) opt->arg) = aDouble; - } - } break; - default: -- fprintf(stdout, POPT_("option type (%d) not implemented in popt\n"), -- opt->argInfo & POPT_ARG_MASK); -+ fprintf(stdout, -+ POPT_("option type (%d) not implemented in popt\n"), -+ (opt->argInfo & POPT_ARG_MASK)); - exit(EXIT_FAILURE); - } - } -@@ -773,83 +886,107 @@ - sizeof(*con->finalArgv) * con->finalArgvAlloced); - } - -+ if (con->finalArgv != NULL) - { char *s = malloc((opt->longName ? strlen(opt->longName) : 0) + 3); -- if (opt->longName) -- sprintf(s, "%s%s", -- ((opt->argInfo & POPT_ARGFLAG_ONEDASH) ? "-" : "--"), -- opt->longName); -- else -- sprintf(s, "-%c", opt->shortName); -- con->finalArgv[con->finalArgvCount++] = s; -+ if (s != NULL) { /* XXX can't happen */ -+ if (opt->longName) -+ sprintf(s, "%s%s", -+ ((opt->argInfo & POPT_ARGFLAG_ONEDASH) ? "-" : "--"), -+ opt->longName); -+ else -+ sprintf(s, "-%c", opt->shortName); -+ con->finalArgv[con->finalArgvCount++] = s; -+ } else -+ con->finalArgv[con->finalArgvCount++] = NULL; - } - - if (opt->arg && (opt->argInfo & POPT_ARG_MASK) == POPT_ARG_NONE) -- /*@-ifempty@*/ ; -+ /*@-ifempty@*/ ; /*@=ifempty@*/ - else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_VAL) -- /*@-ifempty@*/ ; -+ /*@-ifempty@*/ ; /*@=ifempty@*/ - else if ((opt->argInfo & POPT_ARG_MASK) != POPT_ARG_NONE) { -- if (con->os->nextArg) -+ if (con->finalArgv != NULL && con->os->nextArg) - con->finalArgv[con->finalArgvCount++] = -+ /*@-nullpass@*/ /* LCL: con->os->nextArg != NULL */ - xstrdup(con->os->nextArg); -+ /*@=nullpass@*/ - } - } - -- return opt->val; -+ return (opt ? opt->val : -1); /* XXX can't happen */ - } - --const char * poptGetOptArg(poptContext con) { -- const char * ret = con->os->nextArg; -- con->os->nextArg = NULL; -+const char * poptGetOptArg(poptContext con) -+{ -+ const char * ret = NULL; -+ if (con) { -+ ret = con->os->nextArg; -+ con->os->nextArg = NULL; -+ } - return ret; - } - --const char * poptGetArg(poptContext con) { -- const char * ret = (con->nextLeftover < con->numLeftovers) -- ? con->leftovers[con->nextLeftover++] : NULL; -+const char * poptGetArg(poptContext con) -+{ -+ const char * ret = NULL; -+ if (con && con->leftovers != NULL && con->nextLeftover < con->numLeftovers) -+ ret = con->leftovers[con->nextLeftover++]; - return ret; - } - --const char * poptPeekArg(poptContext con) { -- const char * ret = (con->nextLeftover < con->numLeftovers) -- ? con->leftovers[con->nextLeftover] : NULL; -+const char * poptPeekArg(poptContext con) -+{ -+ const char * ret = NULL; -+ if (con && con->leftovers != NULL && con->nextLeftover < con->numLeftovers) -+ ret = con->leftovers[con->nextLeftover]; - return ret; - } - --const char ** poptGetArgs(poptContext con) { -- if (con->numLeftovers == con->nextLeftover) return NULL; -+const char ** poptGetArgs(poptContext con) -+{ -+ if (con == NULL || -+ con->leftovers == NULL || con->numLeftovers == con->nextLeftover) -+ return NULL; - - /* some apps like [like RPM ;-) ] need this NULL terminated */ - con->leftovers[con->numLeftovers] = NULL; - -+ /*@-nullret -nullstate @*/ /* FIX: typedef double indirection. */ - return (con->leftovers + con->nextLeftover); -+ /*@=nullret =nullstate @*/ - } - --void poptFreeContext(poptContext con) { -+poptContext poptFreeContext(poptContext con) -+{ - int i; - -+ if (con == NULL) return con; - poptResetContext(con); -- if (con->os->argb) free(con->os->argb); -+ con->os->argb = _free(con->os->argb); - -+ if (con->aliases != NULL) - for (i = 0; i < con->numAliases; i++) { -- if (con->aliases[i].longName) free((void *)con->aliases[i].longName); -- free(con->aliases[i].argv); -+ con->aliases[i].longName = _free(con->aliases[i].longName); -+ con->aliases[i].argv = _free(con->aliases[i].argv); - } - -+ if (con->execs != NULL) - for (i = 0; i < con->numExecs; i++) { -- if (con->execs[i].longName) free((void *)con->execs[i].longName); -- free((void *)con->execs[i].script); -+ con->execs[i].longName = _free(con->execs[i].longName); -+ con->execs[i].script = _free(con->execs[i].script); - } -- if (con->execs) free((void *)con->execs); -+ con->execs = _free(con->execs); - -- free(con->leftovers); -- free(con->finalArgv); -- if (con->appName) free((void *)con->appName); -- if (con->aliases) free(con->aliases); -- if (con->otherHelp) free((void *)con->otherHelp); -- if (con->execPath) free((void *)con->execPath); -- if (con->arg_strip) PBM_FREE(con->arg_strip); -+ con->leftovers = _free(con->leftovers); -+ con->finalArgv = _free(con->finalArgv); -+ con->appName = _free(con->appName); -+ con->aliases = _free(con->aliases); -+ con->otherHelp = _free(con->otherHelp); -+ con->execPath = _free(con->execPath); -+ con->arg_strip = PBM_FREE(con->arg_strip); - -- free(con); -+ con = _free(con); -+ return con; - } - - int poptAddAlias(poptContext con, struct poptAlias newAlias, -@@ -867,7 +1004,9 @@ - alias = con->aliases + aliasNum; - - alias->longName = (newAlias.longName) -+ /*@-nullpass@*/ /* FIX: malloc can return NULL. */ - ? strcpy(malloc(strlen(newAlias.longName) + 1), newAlias.longName) -+ /*@=nullpass@*/ - : NULL; - alias->shortName = newAlias.shortName; - alias->argc = newAlias.argc; -@@ -876,18 +1015,20 @@ - return 0; - } - --const char * poptBadOption(poptContext con, int flags) { -- struct optionStackEntry * os; -+const char * poptBadOption(poptContext con, int flags) -+{ -+ struct optionStackEntry * os = NULL; - -- if (flags & POPT_BADOPTION_NOALIAS) -- os = con->optionStack; -- else -- os = con->os; -+ if (con != NULL) -+ os = (flags & POPT_BADOPTION_NOALIAS) ? con->optionStack : con->os; - -- return os->argv[os->next - 1]; -+ /*@-nullderef@*/ /* LCL: os->argv != NULL */ -+ return (os && os->argv ? os->argv[os->next - 1] : NULL); -+ /*@=nullderef@*/ - } - --const char *const poptStrerror(const int error) { -+const char *const poptStrerror(const int error) -+{ - switch (error) { - case POPT_ERROR_NOARG: - return POPT_("missing argument"); -@@ -895,6 +1036,8 @@ - return POPT_("unknown option"); - case POPT_ERROR_BADOPERATION: - return POPT_("mutually exclusive logical operations requested"); -+ case POPT_ERROR_NULLARG: -+ return POPT_("opt->arg should not be NULL"); - case POPT_ERROR_OPTSTOODEEP: - return POPT_("aliases nested too deeply"); - case POPT_ERROR_BADQUOTE: -@@ -903,6 +1046,8 @@ - return POPT_("invalid numeric value"); - case POPT_ERROR_OVERFLOW: - return POPT_("number too large or too small"); -+ case POPT_ERROR_MALLOC: -+ return POPT_("memory allocation failed"); - case POPT_ERROR_ERRNO: - return strerror(errno); - default: -@@ -910,8 +1055,10 @@ - } - } - --int poptStuffArgs(poptContext con, const char ** argv) { -+int poptStuffArgs(poptContext con, const char ** argv) -+{ - int argc; -+ int rc; - - if ((con->os - con->optionStack) == POPT_OPTION_DEPTH) - return POPT_ERROR_OPTSTOODEEP; -@@ -924,30 +1071,34 @@ - con->os->nextArg = NULL; - con->os->nextCharArg = NULL; - con->os->currAlias = NULL; -- poptDupArgv(argc, argv, &con->os->argc, &con->os->argv); -+ rc = poptDupArgv(argc, argv, &con->os->argc, &con->os->argv); - con->os->argb = NULL; - con->os->stuffed = 1; - -- return 0; -+ return rc; - } - --const char * poptGetInvocationName(poptContext con) { -- return con->os->argv[0]; -+const char * poptGetInvocationName(poptContext con) -+{ -+ return (con->os->argv ? con->os->argv[0] : ""); - } - --int poptStrippedArgv(poptContext con, int argc, char **argv) -+int poptStrippedArgv(poptContext con, int argc, char ** argv) - { -- int i,j=1, numargs=argc; -+ int numargs = argc; -+ int j = 1; -+ int i; - -+ if (con->arg_strip) - for (i = 1; i < argc; i++) { - if (PBM_ISSET(i, con->arg_strip)) - numargs--; - } - - for (i = 1; i < argc; i++) { -- if (PBM_ISSET(i, con->arg_strip)) -+ if (con->arg_strip && PBM_ISSET(i, con->arg_strip)) - continue; -- argv[j] = (j < numargs) ? argv[i] : '\0'; -+ argv[j] = (j < numargs) ? argv[i] : NULL; - j++; - } - ---- rpm-4.0.2/popt/popt.h.wiget Tue Jan 2 18:25:32 2001 -+++ rpm-4.0.2/popt/popt.h Wed May 30 14:12:34 2001 -@@ -84,6 +84,8 @@ - #define POPT_ERROR_BADNUMBER -17 /*!< invalid numeric value */ - #define POPT_ERROR_OVERFLOW -18 /*!< number too large or too small */ - #define POPT_ERROR_BADOPERATION -19 /*!< mutually exclusive logical operations requested */ -+#define POPT_ERROR_NULLARG -20 /*!< opt->arg should not be NULL */ -+#define POPT_ERROR_MALLOC -21 /*!< memory allocation failed */ - /*@}*/ - - /** \ingroup popt -@@ -110,8 +112,8 @@ - int argInfo; - /*@shared@*/ /*@null@*/ void * arg; /*!< depends on argInfo */ - int val; /*!< 0 means don't return, just update flag */ --/*@shared@*/ /*@null@*/ const char * descrip; /*!< description for autohelp -- may be NULL */ --/*@shared@*/ /*@null@*/ const char * argDescrip; /*!< argument description for autohelp */ -+/*@observer@*/ /*@null@*/ const char * descrip; /*!< description for autohelp -- may be NULL */ -+/*@observer@*/ /*@null@*/ const char * argDescrip; /*!< argument description for autohelp */ - }; - - /** \ingroup popt -@@ -135,7 +137,7 @@ - - /** \ingroup popt - */ --typedef struct poptContext_s * poptContext; -+typedef /*@abstract@*/ struct poptContext_s * poptContext; - - /** \ingroup popt - */ -@@ -156,9 +158,10 @@ - * @param data @todo Document. - */ - typedef void (*poptCallbackType) (poptContext con, -- enum poptCallbackReason reason, -- const struct poptOption * opt, -- const char * arg, const void * data); -+ enum poptCallbackReason reason, -+ /*@null@*/ const struct poptOption * opt, -+ /*@null@*/ const char * arg, -+ /*@null@*/ const void * data); - - /** \ingroup popt - * Initialize popt context. -@@ -169,62 +172,65 @@ - * @param flags or'd POPT_CONTEXT_* bits - * @return initialized popt context - */ --/*@only@*/ poptContext poptGetContext(/*@keep@*/ const char * name, -- int argc, /*@keep@*/ const char ** argv, -- /*@keep@*/ const struct poptOption * options, int flags); -+/*@only@*/ /*@null@*/ poptContext poptGetContext( -+ /*@dependent@*/ /*@keep@*/ const char * name, -+ int argc, /*@dependent@*/ /*@keep@*/ const char ** argv, -+ /*@dependent@*/ /*@keep@*/ const struct poptOption * options, -+ int flags); - - /** \ingroup popt - * Reinitialize popt context. - * @param con context - */ --void poptResetContext(poptContext con); -+void poptResetContext(/*@null@*/poptContext con); - - /** \ingroup popt - * Return value of next option found. - * @param con context - * @return next option val, -1 on last item, POPT_ERROR_* on error - */ --int poptGetNextOpt(poptContext con); -+int poptGetNextOpt(/*@null@*/poptContext con); - /* returns NULL if no argument is available */ - - /** \ingroup popt - * @param con context - */ --/*@observer@*/ /*@null@*/ const char * poptGetOptArg(poptContext con); -+/*@observer@*/ /*@null@*/ const char * poptGetOptArg(/*@null@*/poptContext con); - - /** \ingroup popt - * Return current option's argument. - * @param con context - * @return option argument, NULL if no more options are available - */ --/*@observer@*/ /*@null@*/ const char * poptGetArg(poptContext con); -+/*@observer@*/ /*@null@*/ const char * poptGetArg(/*@null@*/poptContext con); - - /** \ingroup popt - * Peek at current option's argument. - * @param con context - * @return option argument - */ --/*@observer@*/ /*@null@*/ const char * poptPeekArg(poptContext con); -+/*@observer@*/ /*@null@*/ const char * poptPeekArg(/*@null@*/poptContext con); - - /** \ingroup popt - * Return remaining arguments. - * @param con context - * @return argument array, terminated with NULL - */ --/*@observer@*/ /*@null@*/ const char ** poptGetArgs(poptContext con); -+/*@observer@*/ /*@null@*/ const char ** poptGetArgs(/*@null@*/poptContext con); - - /** \ingroup popt - * Return the option which caused the most recent error. - * @param con context - * @return offending option - */ --/*@observer@*/ const char * poptBadOption(poptContext con, int flags); -+/*@observer@*/ const char * poptBadOption(/*@null@*/poptContext con, int flags); - - /** \ingroup popt - * Destroy context. - * @param con context -+ * @return NULL - */ --void poptFreeContext( /*@only@*/ poptContext con); -+/*@null@*/ poptContext poptFreeContext( /*@only@*/ /*@null@*/ poptContext con); - - /** \ingroup popt - * Add arguments to context. -@@ -250,7 +256,9 @@ - * @param fn file name to read - * @return 0 on success, POPT_ERROR_ERRNO on failure - */ --int poptReadConfigFile(poptContext con, const char * fn); -+int poptReadConfigFile(poptContext con, const char * fn) -+ /*@modifies fileSystem, -+ con->execs, con->numExecs @*/; - - /** \ingroup popt - * Read default configuration from /etc/popt and $HOME/.popt. -@@ -258,7 +266,9 @@ - * @param useEnv (unused) - * @return 0 on success, POPT_ERROR_ERRNO on failure - */ --int poptReadDefaultConfig(poptContext con, /*@unused@*/ int useEnv); -+int poptReadDefaultConfig(poptContext con, /*@unused@*/ int useEnv) -+ /*@modifies fileSystem, -+ con->execs, con->numExecs @*/; - - /** \ingroup popt - * Duplicate an argument array. -@@ -271,8 +281,10 @@ - * @retval argvPtr address of returned argument array - * @return 0 on success, POPT_ERROR_NOARG on failure - */ --int poptDupArgv(int argc, const char **argv, -- /*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr); -+int poptDupArgv(int argc, /*@null@*/ const char **argv, -+ /*@null@*/ /*@out@*/ int * argcPtr, -+ /*@null@*/ /*@out@*/ const char *** argvPtr) -+ /*@modifies *argcPtr, *argvPtr @*/; - - /** \ingroup popt - * Parse a string into an argument array. -@@ -286,14 +298,16 @@ - * @retval argvPtr address of returned argument array - */ - int poptParseArgvString(const char * s, -- /*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr); -+ /*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr) -+ /*@modifies *argcPtr, *argvPtr @*/; - - /** \ingroup popt - * Return formatted error string for popt failure. - * @param error popt error - * @return error string - */ --/*@observer@*/ const char *const poptStrerror(const int error); -+/*@observer@*/ const char *const poptStrerror(const int error) -+ /*@*/; - - /** \ingroup popt - * Limit search for executables. -@@ -337,7 +351,7 @@ - * @param con context - * @return new argc - */ --int poptStrippedArgv(poptContext con, int argc, char **argv); -+int poptStrippedArgv(poptContext con, int argc, char ** argv); - - #ifdef __cplusplus - } ---- rpm-4.0.2/popt/poptconfig.c.wiget Tue Dec 19 23:26:02 2000 -+++ rpm-4.0.2/popt/poptconfig.c Wed May 30 14:12:34 2001 -@@ -9,30 +9,33 @@ - #include "system.h" - #include "poptint.h" - --static void configLine(poptContext con, char * line) { -+static void configLine(poptContext con, char * line) -+ /*@modifies *line, -+ con->execs, con->numExecs @*/ -+{ - int nameLength = strlen(con->appName); -- char * opt; -+ const char * opt; - struct poptAlias alias; -- char * entryType; -- char * longName = NULL; -+ const char * entryType; -+ const char * longName = NULL; - char shortName = '\0'; - - if (strncmp(line, con->appName, nameLength)) return; - line += nameLength; -- if (!*line || !isspace(*line)) return; -- while (*line && isspace(*line)) line++; -+ if (*line == '\0' || !isspace(*line)) return; -+ while (*line != '\0' && isspace(*line)) line++; - entryType = line; - -- while (!*line || !isspace(*line)) line++; -+ while (*line == '\0' || !isspace(*line)) line++; - *line++ = '\0'; -- while (*line && isspace(*line)) line++; -- if (!*line) return; -+ while (*line != '\0' && isspace(*line)) line++; -+ if (*line == '\0') return; - opt = line; - -- while (!*line || !isspace(*line)) line++; -+ while (*line == '\0' || !isspace(*line)) line++; - *line++ = '\0'; -- while (*line && isspace(*line)) line++; -- if (!*line) return; -+ while (*line != '\0' && isspace(*line)) line++; -+ if (*line == '\0') return; - - if (opt[0] == '-' && opt[1] == '-') - longName = opt + 2; -@@ -42,10 +45,11 @@ - if (!strcmp(entryType, "alias")) { - if (poptParseArgvString(line, &alias.argc, &alias.argv)) return; - alias.longName = longName, alias.shortName = shortName; -- poptAddAlias(con, alias, 0); -+ (void) poptAddAlias(con, alias, 0); - } else if (!strcmp(entryType, "exec")) { - con->execs = realloc(con->execs, - sizeof(*con->execs) * (con->numExecs + 1)); -+ if (con->execs == NULL) return; /* XXX can't happen */ - if (longName) - con->execs[con->numExecs].longName = xstrdup(longName); - else -@@ -54,49 +58,55 @@ - con->execs[con->numExecs].shortName = shortName; - con->execs[con->numExecs].script = xstrdup(line); - -+ /*@-noeffect@*/ /* LCL: broken? */ - con->numExecs++; -+ /*@=noeffect@*/ - } - } - --int poptReadConfigFile(poptContext con, const char * fn) { -- char * file, * chptr, * end; -- char * buf, * dst; -+int poptReadConfigFile(poptContext con, const char * fn) -+{ -+ const char * file, * chptr, * end; -+ char * buf; -+/*@dependent@*/ char * dst; - int fd, rc; -- int fileLength; -+ off_t fileLength; - - fd = open(fn, O_RDONLY); -- if (fd < 0) { -- if (errno == ENOENT) -- return 0; -- else -- return POPT_ERROR_ERRNO; -- } -+ if (fd < 0) -+ return (errno == ENOENT ? 0 : POPT_ERROR_ERRNO); - - fileLength = lseek(fd, 0, SEEK_END); -- (void) lseek(fd, 0, 0); -+ if (fileLength == -1 || lseek(fd, 0, 0) == -1) { -+ rc = errno; -+ (void) close(fd); -+ errno = rc; -+ return POPT_ERROR_ERRNO; -+ } - - file = alloca(fileLength + 1); -- if (read(fd, file, fileLength) != fileLength) { -+ if (read(fd, (char *)file, fileLength) != fileLength) { - rc = errno; -- close(fd); -+ (void) close(fd); - errno = rc; - return POPT_ERROR_ERRNO; - } -- close(fd); -+ if (close(fd) == -1) -+ return POPT_ERROR_ERRNO; - - dst = buf = alloca(fileLength + 1); - - chptr = file; - end = (file + fileLength); -+ /*@-infloops@*/ /* LCL: can't detect chptr++ */ - while (chptr < end) { - switch (*chptr) { - case '\n': - *dst = '\0'; - dst = buf; - while (*dst && isspace(*dst)) dst++; -- if (*dst && *dst != '#') { -+ if (*dst && *dst != '#') - configLine(con, dst); -- } - chptr++; - break; - case '\\': -@@ -114,6 +124,7 @@ - break; - } - } -+ /*@=infloops@*/ - - return 0; - } -@@ -138,4 +149,3 @@ - - return 0; - } -- ---- rpm-4.0.2/popt/popthelp.c.wiget Thu Feb 22 21:36:56 2001 -+++ rpm-4.0.2/popt/popthelp.c Wed May 30 14:12:34 2001 -@@ -23,31 +23,33 @@ - exit(0); - } - -+/*@-castfcnptr@*/ - struct poptOption poptHelpOptions[] = { - { NULL, '\0', POPT_ARG_CALLBACK, (void *)&displayArgs, '\0', NULL, NULL }, - { "help", '?', 0, NULL, '?', N_("Show this help message"), NULL }, - { "usage", '\0', 0, NULL, 'u', N_("Display brief usage message"), NULL }, - POPT_TABLEEND - } ; -- -+/*@=castfcnptr@*/ - - /*@observer@*/ /*@null@*/ static const char *const --getTableTranslationDomain(const struct poptOption *table) -+getTableTranslationDomain(/*@null@*/ const struct poptOption *table) - { -- const struct poptOption *opt; -- -- for(opt = table; -- opt->longName || opt->shortName || opt->arg; -- opt++) { -- if(opt->argInfo == POPT_ARG_INTL_DOMAIN) -- return opt->arg; -- } -+ const struct poptOption *opt; - -- return NULL; -+ if (table != NULL) -+ for (opt = table; opt->longName || opt->shortName || opt->arg; opt++) { -+ if (opt->argInfo == POPT_ARG_INTL_DOMAIN) -+ return opt->arg; -+ } -+ return NULL; - } - - /*@observer@*/ /*@null@*/ static const char *const --getArgDescrip(const struct poptOption * opt, const char *translation_domain) -+getArgDescrip(const struct poptOption * opt, -+ /*@-paramuse@*/ /* FIX: wazzup? */ -+ /*@null@*/ const char * translation_domain) -+ /*@=paramuse@*/ - { - if (!(opt->argInfo & POPT_ARG_MASK)) return NULL; - -@@ -69,8 +71,8 @@ - } - - static void singleOptionHelp(FILE * f, int maxLeftCol, -- const struct poptOption * opt, -- const char *translation_domain) -+ const struct poptOption * opt, -+ /*@null@*/ const char *translation_domain) - { - int indentLength = maxLeftCol + 5; - int lineLength = 79 - indentLength; -@@ -173,20 +175,22 @@ - } - - static int maxArgWidth(const struct poptOption * opt, -- const char * translation_domain) -+ /*@null@*/ const char * translation_domain) - { - int max = 0; -- int this; -+ int this = 0; - const char * s; - -+ if (opt != NULL) - while (opt->longName || opt->shortName || opt->arg) { - if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) { -+ if (opt->arg) /* XXX program error */ - this = maxArgWidth(opt->arg, translation_domain); - if (this > max) max = this; - } else if (!(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN)) { - this = sizeof(" ")-1; -- if (opt->shortName) this += sizeof("-X")-1; -- if (opt->shortName && opt->longName) this += sizeof(", ")-1; -+ if (opt->shortName != '\0') this += sizeof("-X")-1; -+ if (opt->shortName != '\0' && opt->longName) this += sizeof(", ")-1; - if (opt->longName) { - this += ((opt->argInfo & POPT_ARGFLAG_ONEDASH) - ? sizeof("-")-1 : sizeof("--")-1); -@@ -206,23 +210,25 @@ - return max; - } - --static void singleTableHelp(FILE * f, const struct poptOption * table, -- int left, -- const char *translation_domain) -+static void singleTableHelp(FILE * f, -+ /*@null@*/ const struct poptOption * table, int left, -+ /*@null@*/ const char * translation_domain) - { - const struct poptOption * opt; - const char *sub_transdom; - -+ if (table != NULL) - for (opt = table; (opt->longName || opt->shortName || opt->arg); opt++) { - if ((opt->longName || opt->shortName) && - !(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN)) - singleOptionHelp(f, left, opt, translation_domain); - } - -+ if (table != NULL) - for (opt = table; (opt->longName || opt->shortName || opt->arg); opt++) { - if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) { - sub_transdom = getTableTranslationDomain(opt->arg); -- if(!sub_transdom) -+ if (sub_transdom == NULL) - sub_transdom = translation_domain; - - if (opt->descrip) -@@ -240,7 +246,10 @@ - - fprintf(f, POPT_("Usage:")); - if (!(con->flags & POPT_CONTEXT_KEEP_FIRST)) { -+ /*@-nullderef@*/ /* LCL: wazzup? */ - fn = con->optionStack->argv[0]; -+ /*@=nullderef@*/ -+ if (fn == NULL) return len; - if (strchr(fn, '/')) fn = strrchr(fn, '/') + 1; - fprintf(f, " %s", fn); - len += strlen(fn) + 1; -@@ -253,7 +262,7 @@ - { - int leftColWidth; - -- showHelpIntro(con, f); -+ (void) showHelpIntro(con, f); - if (con->otherHelp) - fprintf(f, " %s\n", con->otherHelp); - else -@@ -264,15 +273,15 @@ - } - - static int singleOptionUsage(FILE * f, int cursor, -- const struct poptOption * opt, -- const char *translation_domain) -+ const struct poptOption * opt, -+ /*@null@*/ const char *translation_domain) - { - int len = 3; - char shortStr[2] = { '\0', '\0' }; - const char * item = shortStr; - const char * argDescrip = getArgDescrip(opt, translation_domain); - -- if (opt->shortName) { -+ if (opt->shortName!= '\0' ) { - if (!(opt->argInfo & POPT_ARG_MASK)) - return cursor; /* we did these already */ - len++; -@@ -296,47 +305,57 @@ - fprintf(f, " [-%s%s%s%s]", - ((opt->shortName || (opt->argInfo & POPT_ARGFLAG_ONEDASH)) ? "" : "-"), - item, -- (argDescrip ? (opt->shortName ? " " : "=") : ""), -+ (argDescrip ? (opt->shortName != '\0' ? " " : "=") : ""), - (argDescrip ? argDescrip : "")); - - return cursor + len + 1; - } - --static int singleTableUsage(FILE * f, int cursor, -- const struct poptOption * opt, const char * translation_domain) -+static int singleTableUsage(FILE * f, -+ int cursor, const struct poptOption * opt, -+ /*@null@*/ const char * translation_domain) - { -+ /*@-branchstate@*/ /* FIX: W2DO? */ -+ if (opt != NULL) - for (; (opt->longName || opt->shortName || opt->arg) ; opt++) { -- if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INTL_DOMAIN) -+ if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INTL_DOMAIN) { - translation_domain = (const char *)opt->arg; -- else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) -+ } else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) { -+ if (opt->arg) /* XXX program error */ - cursor = singleTableUsage(f, cursor, opt->arg, translation_domain); -- else if ((opt->longName || opt->shortName) && -- !(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN)) -+ } else if ((opt->longName || opt->shortName) && -+ !(opt->argInfo & POPT_ARGFLAG_DOC_HIDDEN)) { - cursor = singleOptionUsage(f, cursor, opt, translation_domain); -+ } - } -+ /*@=branchstate@*/ - - return cursor; - } - --static int showShortOptions(const struct poptOption * opt, FILE * f, char * str) -+static int showShortOptions(const struct poptOption * opt, FILE * f, -+ /*@null@*/ char * str) - { -- char s[300]; /* this is larger then the ascii set, so -- it should do just fine */ -+ char * s = alloca(300); /* larger then the ascii set */ - - s[0] = '\0'; -+ /*@-branchstate@*/ /* FIX: W2DO? */ - if (str == NULL) { - memset(s, 0, sizeof(s)); - str = s; - } -+ /*@=branchstate@*/ - -+ if (opt != NULL) - for (; (opt->longName || opt->shortName || opt->arg); opt++) { - if (opt->shortName && !(opt->argInfo & POPT_ARG_MASK)) - str[strlen(str)] = opt->shortName; - else if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) -- showShortOptions(opt->arg, f, str); -+ if (opt->arg) /* XXX program error */ -+ (void) showShortOptions(opt->arg, f, str); - } - -- if (s != str || !*s) -+ if (s != str || *s != '\0') - return 0; - - fprintf(f, " [-%s]", s); -@@ -349,7 +368,7 @@ - - cursor = showHelpIntro(con, f); - cursor += showShortOptions(con->options, f, NULL); -- singleTableUsage(f, cursor, con->options, NULL); -+ (void) singleTableUsage(f, cursor, con->options, NULL); - - if (con->otherHelp) { - cursor += strlen(con->otherHelp) + 1; ---- rpm-4.0.2/popt/poptint.h.wiget Tue Jan 2 00:23:45 2001 -+++ rpm-4.0.2/popt/poptint.h Wed May 30 14:12:34 2001 -@@ -9,6 +9,16 @@ - #ifndef H_POPTINT - #define H_POPTINT - -+/** -+ * Wrapper to free(3), hides const compilation noise, permit NULL, return NULL. -+ * @param this memory to free -+ * @retval NULL always -+ */ -+/*@unused@*/ static inline /*@null@*/ void * _free(/*@only@*/ /*@null@*/ const void * this) { -+ if (this != NULL) free((void *)this); -+ return NULL; -+} -+ - /* Bit mask macros. */ - typedef unsigned int __pbm_bits; - #define __PBM_NBITS (8 * sizeof (__pbm_bits)) -@@ -20,50 +30,50 @@ - #define __PBM_BITS(set) ((set)->bits) - - #define PBM_ALLOC(d) calloc(__PBM_IX (d) + 1, sizeof(__pbm_bits)) --#define PBM_FREE(s) free(s); -+#define PBM_FREE(s) _free(s); - #define PBM_SET(d, s) (__PBM_BITS (s)[__PBM_IX (d)] |= __PBM_MASK (d)) - #define PBM_CLR(d, s) (__PBM_BITS (s)[__PBM_IX (d)] &= ~__PBM_MASK (d)) - #define PBM_ISSET(d, s) ((__PBM_BITS (s)[__PBM_IX (d)] & __PBM_MASK (d)) != 0) - - struct optionStackEntry { - int argc; --/*@only@*/ const char ** argv; --/*@only@*/ pbm_set * argb; -+/*@only@*/ /*@null@*/ const char ** argv; -+/*@only@*/ /*@null@*/ pbm_set * argb; - int next; --/*@only@*/ const char * nextArg; --/*@keep@*/ const char * nextCharArg; --/*@dependent@*/ struct poptAlias * currAlias; -+/*@only@*/ /*@null@*/ const char * nextArg; -+/*@keep@*/ /*@null@*/ const char * nextCharArg; -+/*@dependent@*/ /*@null@*/ struct poptAlias * currAlias; - int stuffed; - }; - - struct execEntry { -- const char * longName; -+/*@owned@*/ /*@null@*/ const char * longName; - char shortName; -- const char * script; -+/*@only@*/ /*@null@*/ const char * script; - }; - - struct poptContext_s { - struct optionStackEntry optionStack[POPT_OPTION_DEPTH]; - /*@dependent@*/ struct optionStackEntry * os; --/*@owned@*/ const char ** leftovers; -+/*@owned@*/ /*@null@*/ const char ** leftovers; - int numLeftovers; - int nextLeftover; - /*@keep@*/ const struct poptOption * options; - int restLeftover; --/*@only@*/ const char * appName; --/*@only@*/ struct poptAlias * aliases; -+/*@only@*/ /*@null@*/ const char * appName; -+/*@only@*/ /*@null@*/ struct poptAlias * aliases; - int numAliases; - int flags; -- struct execEntry * execs; -+/*@owned@*/ /*@null@*/ struct execEntry * execs; - int numExecs; --/*@only@*/ const char ** finalArgv; -+/*@only@*/ /*@null@*/ const char ** finalArgv; - int finalArgvCount; - int finalArgvAlloced; --/*@dependent@*/ struct execEntry * doExec; -+/*@dependent@*/ /*@null@*/ struct execEntry * doExec; - /*@only@*/ const char * execPath; - int execAbsolute; - /*@only@*/ const char * otherHelp; -- pbm_set * arg_strip; -+/*@null@*/ pbm_set * arg_strip; - }; - - #ifdef HAVE_LIBINTL_H ---- rpm-4.0.2/popt/poptparse.c.wiget Tue Dec 19 23:26:19 2000 -+++ rpm-4.0.2/popt/poptparse.c Wed May 30 14:12:34 2001 -@@ -18,6 +18,8 @@ - char * dst; - int i; - -+ if (argc <= 0 || argv == NULL) /* XXX can't happen */ -+ return POPT_ERROR_NOARG; - for (i = 0; i < argc; i++) { - if (argv[i] == NULL) - return POPT_ERROR_NOARG; -@@ -25,6 +27,8 @@ - } - - dst = malloc(nb); -+ if (dst == NULL) /* XXX can't happen */ -+ return POPT_ERROR_MALLOC; - argv2 = (void *) dst; - dst += (argc + 1) * sizeof(*argv); - -@@ -34,8 +38,14 @@ - } - argv2[argc] = NULL; - -- *argvPtr = argv2; -- *argcPtr = argc; -+ if (argvPtr) { -+ *argvPtr = argv2; -+ } else { -+ free(argv2); -+ argv2 = NULL; -+ } -+ if (argcPtr) -+ *argcPtr = argc; - return 0; - } - -@@ -48,28 +58,31 @@ - int argc = 0; - int buflen = strlen(s) + 1; - char * buf = memset(alloca(buflen), 0, buflen); -+ int rc = POPT_ERROR_MALLOC; - -+ if (argv == NULL) return rc; - argv[argc] = buf; - -- for (src = s; *src; src++) { -+ for (src = s; *src != '\0'; src++) { - if (quote == *src) { - quote = '\0'; -- } else if (quote) { -+ } else if (quote != '\0') { - if (*src == '\\') { - src++; - if (!*src) { -- free(argv); -- return POPT_ERROR_BADQUOTE; -+ rc = POPT_ERROR_BADQUOTE; -+ goto exit; - } - if (*src != quote) *buf++ = '\\'; - } - *buf++ = *src; - } else if (isspace(*src)) { -- if (*argv[argc]) { -+ if (*argv[argc] != '\0') { - buf++, argc++; - if (argc == argvAlloced) { - argvAlloced += POPT_ARGV_ARRAY_GROW_DELTA; - argv = realloc(argv, sizeof(*argv) * argvAlloced); -+ if (argv == NULL) goto exit; - } - argv[argc] = buf; - } -@@ -81,8 +94,8 @@ - case '\\': - src++; - if (!*src) { -- free(argv); -- return POPT_ERROR_BADQUOTE; -+ rc = POPT_ERROR_BADQUOTE; -+ goto exit; - } - /*@fallthrough@*/ - default: -@@ -95,9 +108,9 @@ - argc++, buf++; - } - -- (void) poptDupArgv(argc, argv, argcPtr, argvPtr); -- -- free(argv); -+ rc = poptDupArgv(argc, argv, argcPtr, argvPtr); - -- return 0; -+exit: -+ if (argv) free(argv); -+ return rc; - } ---- rpm-4.0.2/popt/system.h.wiget Mon Oct 25 20:22:20 1999 -+++ rpm-4.0.2/popt/system.h Wed May 30 14:12:34 2001 -@@ -44,12 +44,14 @@ - - /*@only@*/ char * xstrdup (const char *str); - -+#if !defined(__LCLINT__) - #if HAVE_MCHECK_H && defined(__GNUC__) - #define vmefail() (fprintf(stderr, "virtual memory exhausted.\n"), exit(EXIT_FAILURE), NULL) - #define xstrdup(_str) (strcpy((malloc(strlen(_str)+1) ? : vmefail()), (_str))) - #else - #define xstrdup(_str) strdup(_str) - #endif /* HAVE_MCHECK_H && defined(__GNUC__) */ -+#endif /* !__LCLINT__ */ - - - #include "popt.h" ---- rpm-4.0.2/popt/test1.c.wiget Sun Dec 31 20:49:44 2000 -+++ rpm-4.0.2/popt/test1.c Wed May 30 14:12:34 2001 -@@ -149,7 +149,7 @@ - fprintf(stdout, "\n"); - - exit: -- poptFreeContext(optCon); -+ optCon = poptFreeContext(optCon); - #if HAVE_MCHECK_H && HAVE_MTRACE - muntrace(); /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */ - #endif ---- rpm-4.0.2/popt/test2.c.wiget Wed Feb 23 18:20:20 2000 -+++ rpm-4.0.2/popt/test2.c Wed May 30 14:12:34 2001 -@@ -133,7 +133,7 @@ - /* although there are no options to be parsed, check for --help */ - poptGetNextOpt(optCon); - -- poptFreeContext(optCon); -+ optCon = poptFreeContext(optCon); - - printf( "dbusername %s\tdbpassword %s\n" - "txhost %s\ttxsslport %d\ttxstoreid %d\tpathofkeyfile %s\n" ---- rpm-4.0.2/popt/testit.sh.wiget Fri Jan 12 17:34:29 2001 -+++ rpm-4.0.2/popt/testit.sh Wed May 30 14:12:34 2001 -@@ -47,7 +47,7 @@ - run test1 "test1 - 19" "" --echo-args - run test1 "test1 - 20" "--arg1" --echo-args --arg1 - run test1 "test1 - 21" "--arg2 something" -T something -e --run test1 "test1 - 22" "--arg2 something -- more args" -T something -a more args -+run test1 "test1 - 22" "--arg2 something more args" -T something -a more args - run test1 "test1 - 23" "--echo-args -a" --echo-args -e -a - run test1 "test1 - 24" "arg1: 0 arg2: (none) short: 1" -shortoption - run test1 "test1 - 25" "arg1: 0 arg2: (none) short: 1" --shortoption ---- rpm/popt/acconfig.h.wiget Wed May 30 15:31:40 2001 -+++ rpm/popt/acconfig.h Wed May 30 15:32:19 2001 -@@ -16,7 +16,6 @@ - a given entry is in the file. - - Leave the following blank line there!! Autoheader needs it. */ --^L - - /* Define to the name of the distribution. */ - #undef PACKAGE -@@ -45,7 +44,6 @@ - /* Absolute path to popt top_sourcedir. */ - #undef POPT_SOURCE_PATH - --^L - /* Leave that blank line there!! Autoheader needs it. - If you're adding to this file, keep in mind: - The entries are in sort -df order: alphabetical, case insensitive,