- fix: parameterized macro segfault (Jakub Bogusz <qboosh@pld.org.pl>).
authorjbj <devnull@localhost>
Fri, 23 Mar 2001 20:27:48 +0000 (20:27 +0000)
committerjbj <devnull@localhost>
Fri, 23 Mar 2001 20:27:48 +0000 (20:27 +0000)
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

CHANGES
lib/misc.c
lib/query.c
lib/rpminstall.c
po/rpm.pot
rpm.c
rpmio/macro.c
rpmqv.c

diff --git a/CHANGES b/CHANGES
index b69aa85..13f2183 100644 (file)
--- 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 <qboosh@pld.org.pl>).
 
 4.0 -> 4.0.[12]
        - add doxygen and lclint annotations most everywhere.
index 7114529..174d0d9 100644 (file)
@@ -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,
index 1c920be..d94e550 100644 (file)
@@ -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;
 
index c232fba..7d881b0 100644 (file)
 /*@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);
index 0e7c28c..e03991b 100644 (file)
@@ -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 <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -646,6 +646,10 @@ msgstr ""
 msgid "    --erase <package>"
 msgstr ""
 
+#: rpm.c:484
+msgid "    -e <package>          "
+msgstr ""
+
 #: rpm.c:485 rpmqv.c:240 rpmqv.c:643
 msgid "erase (uninstall) package"
 msgstr ""
@@ -1467,6 +1471,10 @@ msgstr ""
 msgid "   --erase <package>"
 msgstr ""
 
+#: rpmqv.c:642
+msgid "   -e <package>           "
+msgstr ""
+
 #: rpmqv.c:660
 msgid "   --resign <pkg>+        "
 msgstr ""
diff --git a/rpm.c b/rpm.c
index 7c3da66..a651526 100755 (executable)
--- 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 <package>"));
-    printHelpLine(  "    -e <package>          ",
+    printHelpLine(_("    -e <package>          "),
                  _("erase (uninstall) package"));
     printHelpLine(  "      --allmatches        ",
                  _("remove all packages which match <package> (normally an error is generated if <package> specified multiple packages)"));
index a515c49..301c7ad 100644 (file)
@@ -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 (executable)
--- 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 <package>"));
-    printHelpLine(  "   -e <package>           ",
+    printHelpLine(_("   -e <package>           "),
                  _("erase (uninstall) package"));
     printHelpLine(  "     --allmatches         ",
                  _("remove all packages which match <package> (normally an error is generated if <package> specified multiple packages)"));