summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorjbj <devnull@localhost>1999-11-30 18:07:08 +0000
committerjbj <devnull@localhost>1999-11-30 18:07:08 +0000
commit06aedc29ca90537e91d0ed2b7a90493a8bd7d8e8 (patch)
tree04f9a82d3ac694eb20321a3c9d3c51d294ab74a6 /lib
parent4e56943831a57ab9cc00182007ee55c6fc46ba1e (diff)
downloadrpm-06aedc29ca90537e91d0ed2b7a90493a8bd7d8e8.tar.gz
rpm-06aedc29ca90537e91d0ed2b7a90493a8bd7d8e8.tar.bz2
rpm-06aedc29ca90537e91d0ed2b7a90493a8bd7d8e8.zip
lib/depends.c: Fix minor memory leak.
lib/fprint.c: Pass both dirName/baseName to fpLookup() to avoid memory leaks. lib/rpmdb.c: ditto, and use scaremem=1. lib/transaction.c: Fix minor memory leak. CVS patchset: 3443 CVS date: 1999/11/30 18:07:08
Diffstat (limited to 'lib')
-rw-r--r--lib/depends.c94
-rw-r--r--lib/fprint.c28
-rw-r--r--lib/fprint.h4
-rw-r--r--lib/rpmdb.c34
-rw-r--r--lib/transaction.c2
5 files changed, 82 insertions, 80 deletions
diff --git a/lib/depends.c b/lib/depends.c
index 4670c3921..c90f718ce 100644
--- a/lib/depends.c
+++ b/lib/depends.c
@@ -1358,15 +1358,9 @@ int rpmdepCheck(rpmTransactionSet rpmdep,
{
struct availablePackage * p;
int i, j;
- const char ** baseNames, ** dirNames;
- int_32 * dirIndexes;
- int fileCount;
int rc;
Header h = NULL;
struct problemsSet ps;
- char * filespec = NULL;
- int fileAlloced = 0;
- int len;
ps.alloced = 5;
ps.num = 0;
@@ -1409,9 +1403,6 @@ int rpmdepCheck(rpmTransactionSet rpmdep,
/* now look at the removed packages and make sure they aren't critical */
for (i = 0; i < rpmdep->numRemovedPackages; i++) {
- const char *name;
- const char ** provides;
- int providesCount;
h = rpmdbGetRecord(rpmdep->db, rpmdep->removedPackages[i]);
if (h == NULL) {
@@ -1421,52 +1412,69 @@ int rpmdepCheck(rpmTransactionSet rpmdep,
goto exit;
}
- headerNVR(h, &name, NULL, NULL);
+ { const char * name;
+ headerNVR(h, &name, NULL, NULL);
- /* Erasing: check name against requiredby matches. */
- if (checkDependentPackages(rpmdep, &ps, name))
- goto exit;
+ /* Erasing: check name against requiredby matches. */
+ if (checkDependentPackages(rpmdep, &ps, name))
+ goto exit;
+ }
- if (headerGetEntry(h, RPMTAG_PROVIDENAME, NULL, (void **) &provides,
- &providesCount)) {
- rc = 0;
- for (j = 0; j < providesCount; j++) {
- /* Erasing: check provides against requiredby matches. */
- if (checkDependentPackages(rpmdep, &ps, provides[j])) {
+ { const char ** provides;
+ int providesCount;
+
+ if (headerGetEntry(h, RPMTAG_PROVIDENAME, NULL, (void **) &provides,
+ &providesCount)) {
+ rc = 0;
+ for (j = 0; j < providesCount; j++) {
+ /* Erasing: check provides against requiredby matches. */
+ if (checkDependentPackages(rpmdep, &ps, provides[j])) {
rc = 1;
break;
+ }
}
+ xfree(provides);
+ if (rc)
+ goto exit;
}
- free(provides);
- if (rc) goto exit;
}
- if (headerGetEntry(h, RPMTAG_COMPFILELIST, NULL,
+ { const char ** baseNames, ** dirNames;
+ int_32 * dirIndexes;
+ int fileCount;
+ char * fileName = NULL;
+ int fileAlloced = 0;
+ int len;
+
+ if (headerGetEntry(h, RPMTAG_COMPFILELIST, NULL,
(void **) &baseNames, &fileCount)) {
- headerGetEntry(h, RPMTAG_COMPDIRLIST, NULL,
+ headerGetEntry(h, RPMTAG_COMPDIRLIST, NULL,
(void **) &dirNames, NULL);
- headerGetEntry(h, RPMTAG_COMPFILEDIRS, NULL,
+ headerGetEntry(h, RPMTAG_COMPFILEDIRS, NULL,
(void **) &dirIndexes, NULL);
- rc = 0;
- for (j = 0; j < fileCount; j++) {
- len = strlen(baseNames[j]) + 1 +
- strlen(dirNames[dirIndexes[j]]);
- if (len > fileAlloced) {
- fileAlloced = len * 2;
- filespec = xrealloc(filespec, fileAlloced);
+ rc = 0;
+ for (j = 0; j < fileCount; j++) {
+ len = strlen(baseNames[j]) + 1 +
+ strlen(dirNames[dirIndexes[j]]);
+ if (len > fileAlloced) {
+ fileAlloced = len * 2;
+ fileName = xrealloc(fileName, fileAlloced);
+ }
+ strcpy(fileName, dirNames[dirIndexes[j]]);
+ strcat(fileName, baseNames[j]);
+ /* Erasing: check filename against requiredby matches. */
+ if (checkDependentPackages(rpmdep, &ps, fileName)) {
+ rc = 1;
+ break;
+ }
}
- strcpy(filespec, dirNames[dirIndexes[j]]);
- strcat(filespec, baseNames[j]);
- /* Erasing: check filename against requiredby matches. */
- if (checkDependentPackages(rpmdep, &ps, filespec)) {
- rc = 1;
- break;
- }
- }
- free(baseNames);
- free(dirNames);
- if (rc) goto exit;
+ free(fileName);
+ free(baseNames);
+ free(dirNames);
+ if (rc)
+ goto exit;
+ }
}
headerFree(h); h = NULL;
@@ -1485,8 +1493,6 @@ int rpmdepCheck(rpmTransactionSet rpmdep,
exit:
if (h)
headerFree(h);
- if (filespec)
- free(filespec);
if (ps.problems) free(ps.problems);
return 1;
}
diff --git a/lib/fprint.c b/lib/fprint.c
index affcca89a..7511ccfb0 100644
--- a/lib/fprint.c
+++ b/lib/fprint.c
@@ -95,13 +95,15 @@ static fingerPrint doLookup(fingerPrintCache cache, const char * dirName,
fp.subDir++;
else
fp.subDir = "";
- if (!scareMemory && fp.subDir != NULL)
- fp.subDir = xstrdup(fp.subDir); /* XXX memory leak, but how
- do we know we can free it?
- Using the (new) cache would
- work if hash tables allowed
- traversal. */
fp.baseName = baseName;
+ if (!scareMemory && fp.subDir != NULL) {
+ /* XXX memory leak, but how do we know we can free it?
+ * XXX Using the (new) cache would work if hash tables
+ * XXX allowed traversal.
+ */
+ fp.subDir = xstrdup(fp.subDir);
+ fp.baseName = xstrdup(fp.baseName);
+ }
return fp;
}
@@ -117,18 +119,10 @@ static fingerPrint doLookup(fingerPrintCache cache, const char * dirName,
return fp;
}
-fingerPrint fpLookup(fingerPrintCache cache, const char * fullName,
- int scareMemory)
+fingerPrint fpLookup(fingerPrintCache cache, const char * dirName,
+ const char * baseName, int scareMemory)
{
- char *dn = strcpy(alloca(strlen(fullName)+1), fullName);
- char *bn = strrchr(dn, '/');
-
- if (bn)
- *bn++ = '\0';
- else
- bn = dn;
-
- return doLookup(cache, dn, bn, scareMemory);
+ return doLookup(cache, dirName, baseName, scareMemory);
}
unsigned int fpHashFunction(const void * key)
diff --git a/lib/fprint.h b/lib/fprint.h
index 913412a3b..2dae67630 100644
--- a/lib/fprint.h
+++ b/lib/fprint.h
@@ -39,8 +39,8 @@ extern "C" {
/* Be carefull with the memory... assert(*fullName == '/' || !scareMemory) */
fingerPrintCache fpCacheCreate(int sizeHint);
void fpCacheFree(fingerPrintCache cache);
-fingerPrint fpLookup(fingerPrintCache cache, const char * fullName,
- int scareMemory);
+fingerPrint fpLookup(fingerPrintCache cache, const char * dirName,
+ const char * baseName, int scareMemory);
/* Hash based on dev and inode only! */
unsigned int fpHashFunction(const void * key);
diff --git a/lib/rpmdb.c b/lib/rpmdb.c
index 0ff2a6161..7e59ae7ed 100644
--- a/lib/rpmdb.c
+++ b/lib/rpmdb.c
@@ -355,21 +355,29 @@ Header rpmdbGetRecord(rpmdb db, unsigned int offset)
int rpmdbFindByFile(rpmdb db, const char * filespec, dbiIndexSet * matches)
{
+ const char * dirName;
const char * baseName;
fingerPrint fp1, fp2;
dbiIndexSet allMatches;
- int i, rc, num;
+ int i, rc;
Header h;
fingerPrintCache fpc;
- fpc = fpCacheCreate(20);
- fp1 = fpLookup(fpc, filespec, 0);
-
- baseName = strrchr(filespec, '/');
- if (baseName == NULL)
- baseName = filespec;
- else
+ { char * t = strcpy(alloca(strlen(filespec)+1), filespec);
+ char * te = strrchr(t, '/');
+ if (te) {
+ te++;
+ *te = '\0';
+ }
+ dirName = t;
+ }
+ if ((baseName = strrchr(filespec, '/')) != NULL)
baseName++;
+ else
+ baseName = filespec;
+
+ fpc = fpCacheCreate(20);
+ fp1 = fpLookup(fpc, dirName, baseName, 1);
rc = dbiSearchIndex(db->fileIndex, baseName, &allMatches);
if (rc) {
@@ -382,7 +390,6 @@ int rpmdbFindByFile(rpmdb db, const char * filespec, dbiIndexSet * matches)
while (i < allMatches.count) {
const char ** baseNames, ** dirNames;
int_32 * dirIndexes;
- char * otherFile;
if ((h = rpmdbGetRecord(db, allMatches.recs[i].recOffset)) == NULL) {
i++;
@@ -397,17 +404,12 @@ int rpmdbFindByFile(rpmdb db, const char * filespec, dbiIndexSet * matches)
(void **) &dirNames, NULL);
do {
- num = allMatches.recs[i].fileNumber;
- otherFile = xmalloc(strlen(dirNames[dirIndexes[num]]) +
- strlen(baseNames[num]) + 1);
- strcpy(otherFile, dirNames[dirIndexes[num]]);
- strcat(otherFile, baseNames[num]);
+ int num = allMatches.recs[i].fileNumber;
- fp2 = fpLookup(fpc, otherFile, 1);
+ fp2 = fpLookup(fpc, dirNames[dirIndexes[num]], baseNames[num], 1);
if (FP_EQUAL(fp1, fp2))
dbiAppendIndexRecord(matches, allMatches.recs[i]);
- free(otherFile);
i++;
} while ((i < allMatches.count) &&
((i == 0) || (allMatches.recs[i].recOffset ==
diff --git a/lib/transaction.c b/lib/transaction.c
index 4ebe009ec..a527be1bb 100644
--- a/lib/transaction.c
+++ b/lib/transaction.c
@@ -94,7 +94,7 @@ static void freeFi(TFI_t *fi)
if (fi->bnl) {
free(fi->bnl); fi->bnl = NULL;
free(fi->dnl); fi->dnl = NULL;
- fi->dil = NULL;
+ free(fi->dil); fi->dil = NULL;
}
if (fi->flinks) {
free(fi->flinks); fi->flinks = NULL;