From: jbj Date: Fri, 23 Mar 2001 20:27:48 +0000 (+0000) Subject: - fix: parameterized macro segfault (Jakub Bogusz ). X-Git-Tag: tznext/4.11.0.1.tizen20130304~7837 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=075607676dee5f7d2006ba6f561b15d2e505e10a;p=tools%2Flibrpm-tizen.git - fix: parameterized macro segfault (Jakub Bogusz ). fix: off by 1 with rpmGlob when presented with multiple non-globbed items. fix: rpmReadPackageManifest actually works now. CVS patchset: 4653 CVS date: 2001/03/23 20:27:48 --- diff --git a/CHANGES b/CHANGES index b69aa85..13f2183 100644 --- a/CHANGES +++ b/CHANGES @@ -17,6 +17,7 @@ - add -g to optflags in per-platform config. - permit confgure/compile with db3-3.2.9. - permit manifest files as args to query/verify modes. + - fix: parameterized macro segfault (Jakub Bogusz ). 4.0 -> 4.0.[12] - add doxygen and lclint annotations most everywhere. diff --git a/lib/misc.c b/lib/misc.c index 7114529..174d0d9 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -16,6 +16,16 @@ static int _debug = 0; /*@access Header@*/ /* XXX compared with NULL */ /*@access FD_t@*/ /* XXX compared with NULL */ +/** + * Wrapper to free(3), hides const compilation noise, permit NULL, return NULL. + * @param this memory to free + * @retval NULL always + */ +static /*@null@*/ void * _free(/*@only@*/ /*@null@*/ const void * this) { + if (this) free((void *)this); + return NULL; +} + char * RPMVERSION = VERSION; /* just to put a marker in librpm.a */ char ** splitString(const char * str, int length, char sep) @@ -56,8 +66,8 @@ char ** splitString(const char * str, int length, char sep) void freeSplitString(char ** list) { - free(list[0]); - free(list); + list[0] = _free(list[0]); + list = _free(list); } int rpmfileexists(const char * urlfn) @@ -293,11 +303,11 @@ int makeTempFile(const char * prefix, const char ** fnptr, FD_t * fdptr) char tfnbuf[64]; #ifndef NOTYET sprintf(tfnbuf, "rpm-tmp.%d", ran++); - if (tempfn) free((void *)tempfn); + tempfn = _free(tempfn); tempfn = rpmGenPath(prefix, tpmacro, tfnbuf); #else strcpy(tfnbuf, "rpm-tmp.XXXXXX"); - if (tempfn) free((void *)tempfn); + tempfn = _free(tempfn); tempfn = rpmGenPath(prefix, tpmacro, mktemp(tfnbuf)); #endif @@ -347,16 +357,14 @@ int makeTempFile(const char * prefix, const char ** fnptr, FD_t * fdptr) if (fnptr) *fnptr = tempfn; - else if (tempfn) { - free((void *)tempfn); - tempfn = NULL; - } + else + tempfn = _free(tempfn); *fdptr = fd; return 0; errxit: - if (tempfn) free((void *)tempfn); + tempfn = _free(tempfn); if (fd) Fclose(fd); return 1; } @@ -391,6 +399,7 @@ void compressFilelist(Header h) const char ** dirNames; const char ** baseNames; int_32 * dirIndexes; + int fnt; int count; int i; int dirIndex = -1; @@ -406,7 +415,7 @@ void compressFilelist(Header h) return; /* Already converted. */ } - if (!headerGetEntry(h, RPMTAG_OLDFILENAMES, NULL, + if (!headerGetEntry(h, RPMTAG_OLDFILENAMES, &fnt, (void **) &fileNames, &count)) return; /* no file list */ @@ -455,7 +464,7 @@ exit: headerAddEntry(h, RPMTAG_DIRNAMES, RPM_STRING_ARRAY_TYPE, dirNames, dirIndex + 1); - free((void *)fileNames); + fileNames = headerFreeData(fileNames, fnt); headerRemoveEntry(h, RPMTAG_OLDFILENAMES); } @@ -474,16 +483,17 @@ static void doBuildFileList(Header h, /*@out@*/ const char *** fileListPtr, int count; const char ** fileNames; int size; + int bnt, dnt; char * data; int i; - if (!headerGetEntry(h, baseNameTag, NULL, (void **) &baseNames, &count)) { + if (!headerGetEntry(h, baseNameTag, &bnt, (void **) &baseNames, &count)) { if (fileListPtr) *fileListPtr = NULL; if (fileCountPtr) *fileCountPtr = 0; return; /* no file list */ } - headerGetEntry(h, dirNameTag, NULL, (void **) &dirNames, NULL); + headerGetEntry(h, dirNameTag, &dnt, (void **) &dirNames, NULL); headerGetEntry(h, dirIndexesTag, NULL, (void **) &dirIndexes, &count); size = sizeof(*fileNames) * count; @@ -497,13 +507,13 @@ static void doBuildFileList(Header h, /*@out@*/ const char *** fileListPtr, data = stpcpy( stpcpy(data, dirNames[dirIndexes[i]]), baseNames[i]); *data++ = '\0'; } - free((void *)baseNames); - free((void *)dirNames); + baseNames = headerFreeData(baseNames, bnt); + dirNames = headerFreeData(dirNames, dnt); if (fileListPtr) *fileListPtr = fileNames; else - free((void *)fileNames); + fileNames = _free(fileNames); if (fileCountPtr) *fileCountPtr = count; } @@ -519,7 +529,7 @@ void expandFilelist(Header h) return; headerAddEntry(h, RPMTAG_OLDFILENAMES, RPM_STRING_ARRAY_TYPE, fileNames, count); - free((void *)fileNames); + fileNames = _free(fileNames); } headerRemoveEntry(h, RPMTAG_DIRNAMES); @@ -601,10 +611,11 @@ int rpmGlob(const char * patterns, int * argcPtr, const char *** argvPtr) if (argc == 0) argv = xmalloc((argc+2) * sizeof(*argv)); else - argv = xrealloc(argv, (argc+1) * sizeof(*argv)); + argv = xrealloc(argv, (argc+2) * sizeof(*argv)); + argv[argc] = xstrdup(av[j]); if (_debug) -fprintf(stderr, "*** rpmGlob argv[%d] \"%s\"\n", argc, av[j]); - argv[argc++] = xstrdup(av[j]); +fprintf(stderr, "*** rpmGlob argv[%d] \"%s\"\n", argc, argv[argc]); + argc++; continue; } @@ -656,7 +667,7 @@ fprintf(stderr, "*** rpmGlob argv[%d] \"%s\"\n", argc, globURL); argv[argc++] = xstrdup(globURL); } Globfree(&gl); - free((void *)globURL); + globURL = _free(globURL); } if (argv != NULL && argc > 0) { argv[argc] = NULL; @@ -670,13 +681,11 @@ fprintf(stderr, "*** rpmGlob argv[%d] \"%s\"\n", argc, globURL); exit: - if (av) - free((void *)av); + av = _free(av); if ((rc || argvPtr == NULL) && argv) { for (i = 0; i < argc; i++) - free((void *)argv[i]); - free((void *)argv); - argv = NULL; + argv[i] = _free(argv[i]); + argv = _free(argv); } return rc; } @@ -833,8 +842,8 @@ void providePackageNVR(Header h) } exit: - if (provides) free((void *)provides); - if (providesEVR) free((void *)providesEVR); + provides = headerFreeData(provides, -1); + providesEVR = headerFreeData(providesEVR, -1); if (bingo) { headerAddOrAppendEntry(h, RPMTAG_PROVIDENAME, RPM_STRING_ARRAY_TYPE, diff --git a/lib/query.c b/lib/query.c index 1c920be..d94e550 100644 --- a/lib/query.c +++ b/lib/query.c @@ -491,26 +491,26 @@ int rpmQueryVerify(QVA_t *qva, rpmQVSources source, const char * arg, switch (source) { case RPMQV_RPM: - { int argc = 0; - const char ** argv = NULL; + { int ac = 0; + const char ** av = NULL; const char * fileURL = NULL; rpmRC rpmrc; int i; - rc = rpmGlob(arg, &argc, &argv); + rc = rpmGlob(arg, &ac, &av); if (rc) return 1; restart: - for (i = 0; i < argc; i++) { + for (i = 0; i < ac; i++) { FD_t fd; fileURL = _free(fileURL); - fileURL = argv[i]; - argv[i] = NULL; + fileURL = av[i]; + av[i] = NULL; /* Try to read the header from a package file. */ fd = Fopen(fileURL, "r.ufdio"); - if (Ferror(fd)) { + if (fd == NULL || Ferror(fd)) { rpmError(RPMERR_OPEN, _("open of %s failed: %s\n"), fileURL, Fstrerror(fd)); if (fd) Fclose(fd); @@ -551,7 +551,7 @@ restart: } /* Read list of packages from manifest. */ - retcode = rpmReadPackageManifest(fd, &argc, &argv); + retcode = rpmReadPackageManifest(fd, &ac, &av); if (retcode) { rpmError(RPMERR_QUERY, _("%s: Fread failed: %s\n"), fileURL, Fstrerror(fd)); @@ -567,10 +567,10 @@ restart: } fileURL = _free(fileURL); - if (argv) { - for (i = 0; i < argc; i++) - argv[i] = _free(argv[i]); - argv = _free(argv); + if (av) { + for (i = 0; i < ac; i++) + av[i] = _free(av[i]); + av = _free(av); } } break; diff --git a/lib/rpminstall.c b/lib/rpminstall.c index c232fba..7d881b0 100644 --- a/lib/rpminstall.c +++ b/lib/rpminstall.c @@ -15,6 +15,16 @@ /*@access Header@*/ /* XXX compared with NULL */ /*@access FD_t@*/ /* XXX compared with NULL */ +/** + * Wrapper to free(3), hides const compilation noise, permit NULL, return NULL. + * @param this memory to free + * @retval NULL always + */ +static /*@null@*/ void * _free(/*@only@*/ /*@null@*/ const void * this) { + if (this) free((void *)this); + return NULL; +} + /* Define if you want percentage progress in the hash bars when * writing to a tty (ordinary hash bars otherwise) --claudio */ @@ -28,6 +38,8 @@ static int progressTotal = 0; static int progressCurrent = 0; #endif +/** + */ static void printHash(const unsigned long amount, const unsigned long total) { int hashesNeeded; @@ -123,7 +135,7 @@ static void * showProgress(const void * arg, const rpmCallbackType what, fprintf(stdout, "%s\n", s); fflush(stdout); } - free(s); + s = _free(s); break; case RPMCALLBACK_TRANS_PROGRESS: @@ -225,8 +237,8 @@ int rpmInstall(const char * rootdir, const char ** fileArgv, { int myrc; int j; const char *tfn; - const char ** argv; - int argc; + int argc = 0; + const char ** argv = NULL; myrc = rpmGlob(*fileURL, &argc, &argv); if (myrc) { @@ -264,16 +276,15 @@ int rpmInstall(const char * rootdir, const char ** fileArgv, argv[j], ftpStrerror(myrc)); numFailed++; pkgURL[i] = NULL; - free((void *)tfn); + tfn = _free(tfn); } else { tmppkgURL[numTmpPkgs++] = pkgURL[i++] = tfn; } } if (argv) { for (j = 0; j < argc; j++) - free((void *)argv[j]); - free((void *)argv); - argv = NULL; + argv[j] = _free(argv[j]); + argv = _free(argv); } } break; case URL_IS_PATH: @@ -342,7 +353,7 @@ int rpmInstall(const char * rootdir, const char ** fileArgv, "%{_dbpath}", NULL); rpmMessage(RPMMESS_ERROR, _("cannot open Packages database in %s\n"), dn); - free((void *)dn); + dn = _free(dn); numFailed++; pkgURL[i] = NULL; break; @@ -358,7 +369,7 @@ int rpmInstall(const char * rootdir, const char ** fileArgv, if (headerGetEntry(h, RPMTAG_PREFIXES, NULL, (void **) &paths, &c) && (c == 1)) { defaultReloc->oldPath = xstrdup(paths[0]); - free((void *)paths); + paths = _free(paths); } else { const char * name; headerNVR(h, &name, NULL, NULL); @@ -419,10 +430,7 @@ int rpmInstall(const char * rootdir, const char ** fileArgv, /*@notreached@*/ break; } - if (defaultReloc) { - free((void *)defaultReloc->oldPath); - defaultReloc->oldPath = NULL; - } + defaultReloc->oldPath = _free(defaultReloc->oldPath); numRPMS++; } @@ -502,10 +510,10 @@ int rpmInstall(const char * rootdir, const char ** fileArgv, for (i = 0; i < numTmpPkgs; i++) { Unlink(tmppkgURL[i]); - free((void *)tmppkgURL[i]); + tmppkgURL[i] = _free(tmppkgURL[i]); } - free((void *)tmppkgURL); tmppkgURL = NULL; - free((void *)pkgURL); pkgURL = NULL; + tmppkgURL = _free(tmppkgURL); + pkgURL = _free(pkgURL); /* FIXME how do we close our various fd's? */ @@ -517,11 +525,10 @@ errxit: if (numRPMS && ts) rpmtransFree(ts); if (tmppkgURL) { for (i = 0; i < numTmpPkgs; i++) - free((void *)tmppkgURL[i]); - free((void *)tmppkgURL); + tmppkgURL[i] = _free(tmppkgURL[i]); + tmppkgURL = _free(tmppkgURL); } - if (pkgURL) - free((void *)pkgURL); + pkgURL = _free(pkgURL); if (dbIsOpen) rpmdbClose(db); return numPkgs; } @@ -551,7 +558,7 @@ int rpmErase(const char * rootdir, const char ** argv, const char *dn; dn = rpmGetPath( (rootdir ? rootdir : ""), "%{_dbpath}", NULL); rpmMessage(RPMMESS_ERROR, _("cannot open %s/packages.rpm\n"), dn); - free((void *)dn); + dn = _free(dn); return -1; } @@ -632,14 +639,10 @@ int rpmInstallSource(const char * rootdir, const char * arg, } if (rc != 0) { rpmMessage(RPMMESS_ERROR, _("%s cannot be installed\n"), arg); - if (specFile && *specFile) { - free((void *)*specFile); - *specFile = NULL; - } - if (cookie && *cookie) { - free(*cookie); - *cookie = NULL; - } + if (specFile && *specFile) + *specFile = _free(*specFile); + if (cookie && *cookie) + *cookie = _free(*cookie); } Fclose(fd); diff --git a/po/rpm.pot b/po/rpm.pot index 0e7c28c..e03991b 100644 --- a/po/rpm.pot +++ b/po/rpm.pot @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2001-03-22 17:35-0500\n" +"POT-Creation-Date: 2001-03-23 10:10-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -646,6 +646,10 @@ msgstr "" msgid " --erase " msgstr "" +#: rpm.c:484 +msgid " -e " +msgstr "" + #: rpm.c:485 rpmqv.c:240 rpmqv.c:643 msgid "erase (uninstall) package" msgstr "" @@ -1467,6 +1471,10 @@ msgstr "" msgid " --erase " msgstr "" +#: rpmqv.c:642 +msgid " -e " +msgstr "" + #: rpmqv.c:660 msgid " --resign + " msgstr "" diff --git a/rpm.c b/rpm.c index 7c3da66..a651526 100755 --- a/rpm.c +++ b/rpm.c @@ -481,7 +481,7 @@ static void printHelp(void) { _("upgrade to an old version of the package (--force on upgrades does this automatically)")); puts(""); puts( _(" --erase ")); - printHelpLine( " -e ", + printHelpLine(_(" -e "), _("erase (uninstall) package")); printHelpLine( " --allmatches ", _("remove all packages which match (normally an error is generated if specified multiple packages)")); diff --git a/rpmio/macro.c b/rpmio/macro.c index a515c49..301c7ad 100644 --- a/rpmio/macro.c +++ b/rpmio/macro.c @@ -801,7 +801,7 @@ grabArgs(MacroBuf *mb, const MacroEntry *me, const char *se, char lastc) /* Build argv array */ argv = (const char **) alloca((argc + 1) * sizeof(char *)); be[-1] = ' '; /* be - 1 == b + strlen(b) == buf + strlen(buf) */ - buf[0] = '\0'; + be[0] = '\0'; b = buf; for (c = 0; c < argc; c++) { argv[c] = b; diff --git a/rpmqv.c b/rpmqv.c index 468e8ba..6f5d604 100755 --- a/rpmqv.c +++ b/rpmqv.c @@ -639,7 +639,7 @@ static void printHelp(void) { _("upgrade to an old version of the package (--force on upgrades does this automatically)")); puts(""); puts( _(" --erase ")); - printHelpLine( " -e ", + printHelpLine(_(" -e "), _("erase (uninstall) package")); printHelpLine( " --allmatches ", _("remove all packages which match (normally an error is generated if specified multiple packages)"));