Blob Blame History Raw
diff --git a/lib/fprint.c b/lib/fprint.c
index e57ba20..c56b0e5 100644
--- a/lib/fprint.c
+++ b/lib/fprint.c
@@ -37,8 +37,10 @@ fingerPrintCache fpCacheCreate(int sizeHint)
 
 fingerPrintCache fpCacheFree(fingerPrintCache cache)
 {
-    cache->ht = rpmFpEntryHashFree(cache->ht);
-    free(cache);
+    if (cache) {
+	cache->ht = rpmFpEntryHashFree(cache->ht);
+	free(cache);
+    }
     return NULL;
 }
 
diff --git a/lib/rpmdb.c b/lib/rpmdb.c
index 439a974..d76630e 100644
--- a/lib/rpmdb.c
+++ b/lib/rpmdb.c
@@ -1098,20 +1098,20 @@ int rpmdbVerify(const char * prefix)
 static int rpmdbFindByFile(rpmdb db, const char * filespec,
 		DBT * key, DBT * data, dbiIndexSet * matches)
 {
-    char * dirName;
+    char * dirName = NULL;
     const char * baseName;
-    fingerPrintCache fpc;
+    fingerPrintCache fpc = NULL;
     fingerPrint fp1;
     dbiIndex dbi = NULL;
     DBC * dbcursor;
     dbiIndexSet allMatches = NULL;
     dbiIndexItem rec = NULL;
     unsigned int i;
-    int rc;
+    int rc = -2; /* assume error */
     int xx;
 
     *matches = NULL;
-    if (filespec == NULL) return -2;
+    if (filespec == NULL) return rc; /* nothing alloced yet */
 
     if ((baseName = strrchr(filespec, '/')) != NULL) {
 	size_t len = baseName - filespec + 1;
@@ -1123,11 +1123,7 @@ static int rpmdbFindByFile(rpmdb db, const char * filespec,
 	baseName = filespec;
     }
     if (baseName == NULL)
-	return -2;
-
-    fpc = fpCacheCreate(20);
-    fp1 = fpLookup(fpc, dirName, baseName, 1);
-    free(dirName);
+	goto exit;
 
     dbi = dbiOpen(db, RPMTAG_BASENAMES, 0);
     if (dbi != NULL) {
@@ -1154,16 +1150,14 @@ static int rpmdbFindByFile(rpmdb db, const char * filespec,
     } else
 	rc = -2;
 
-    if (rc) {
-	allMatches = dbiFreeIndexSet(allMatches);
-	fpc = fpCacheFree(fpc);
-	return rc;
-    }
+    if (rc || allMatches == NULL) goto exit;
 
     *matches = xcalloc(1, sizeof(**matches));
     rec = dbiIndexNewItem(0, 0);
+    fpc = fpCacheCreate(allMatches->count);
+    fp1 = fpLookup(fpc, dirName, baseName, 1);
+
     i = 0;
-    if (allMatches != NULL)
     while (i < allMatches->count) {
 	struct rpmtd_s bn, dn, di;
 	const char ** baseNames, ** dirNames;
@@ -1216,16 +1210,19 @@ static int rpmdbFindByFile(rpmdb db, const char * filespec,
     }
 
     rec = _free(rec);
-    allMatches = dbiFreeIndexSet(allMatches);
-
-    fpc = fpCacheFree(fpc);
+    fpCacheFree(fpc);
 
     if ((*matches)->count == 0) {
 	*matches = dbiFreeIndexSet(*matches);
-	return 1;
+	rc = 1;
+    } else {
+	rc = 0;
     }
 
-    return 0;
+exit:
+    dbiFreeIndexSet(allMatches);
+    free(dirName);
+    return rc;
 }
 
 /* XXX python/upgrade.c, install.c, uninstall.c */