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
- 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.
/*@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)
void freeSplitString(char ** list)
{
- free(list[0]);
- free(list);
+ list[0] = _free(list[0]);
+ list = _free(list);
}
int rpmfileexists(const char * urlfn)
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
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;
}
const char ** dirNames;
const char ** baseNames;
int_32 * dirIndexes;
+ int fnt;
int count;
int i;
int dirIndex = -1;
return; /* Already converted. */
}
- if (!headerGetEntry(h, RPMTAG_OLDFILENAMES, NULL,
+ if (!headerGetEntry(h, RPMTAG_OLDFILENAMES, &fnt,
(void **) &fileNames, &count))
return; /* no file list */
headerAddEntry(h, RPMTAG_DIRNAMES, RPM_STRING_ARRAY_TYPE,
dirNames, dirIndex + 1);
- free((void *)fileNames);
+ fileNames = headerFreeData(fileNames, fnt);
headerRemoveEntry(h, RPMTAG_OLDFILENAMES);
}
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;
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;
}
return;
headerAddEntry(h, RPMTAG_OLDFILENAMES, RPM_STRING_ARRAY_TYPE,
fileNames, count);
- free((void *)fileNames);
+ fileNames = _free(fileNames);
}
headerRemoveEntry(h, RPMTAG_DIRNAMES);
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;
}
argv[argc++] = xstrdup(globURL);
}
Globfree(&gl);
- free((void *)globURL);
+ globURL = _free(globURL);
}
if (argv != NULL && argc > 0) {
argv[argc] = NULL;
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;
}
}
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,
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);
}
/* 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));
}
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;
/*@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
*/
static int progressCurrent = 0;
#endif
+/**
+ */
static void printHash(const unsigned long amount, const unsigned long total)
{
int hashesNeeded;
fprintf(stdout, "%s\n", s);
fflush(stdout);
}
- free(s);
+ s = _free(s);
break;
case RPMCALLBACK_TRANS_PROGRESS:
{ 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) {
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:
"%{_dbpath}", NULL);
rpmMessage(RPMMESS_ERROR,
_("cannot open Packages database in %s\n"), dn);
- free((void *)dn);
+ dn = _free(dn);
numFailed++;
pkgURL[i] = NULL;
break;
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);
/*@notreached@*/ break;
}
- if (defaultReloc) {
- free((void *)defaultReloc->oldPath);
- defaultReloc->oldPath = NULL;
- }
+ defaultReloc->oldPath = _free(defaultReloc->oldPath);
numRPMS++;
}
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? */
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;
}
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;
}
}
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);
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"
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 ""
msgid " --erase <package>"
msgstr ""
+#: rpmqv.c:642
+msgid " -e <package> "
+msgstr ""
+
#: rpmqv.c:660
msgid " --resign <pkg>+ "
msgstr ""
_("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)"));
/* 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;
_("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)"));