--- 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,