From 42912e817670cecfbec2ad05d966f7e2cd48e343 Mon Sep 17 00:00:00 2001 From: "gordon%netscape.com" Date: Fri, 25 May 2001 18:47:53 +0000 Subject: [PATCH] Fix bug 82370, leak in disk cache. r=dbaron, sr=darin, a=asa. git-svn-id: svn://10.0.0.236/trunk@95922 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/netwerk/cache/src/nsDiskCacheDevice.cpp | 8 ++++---- mozilla/netwerk/cache/src/nsDiskCacheEntry.cpp | 8 +++++++- mozilla/netwerk/cache/src/nsDiskCacheMap.cpp | 8 +++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/mozilla/netwerk/cache/src/nsDiskCacheDevice.cpp b/mozilla/netwerk/cache/src/nsDiskCacheDevice.cpp index c5b89cdf4c7..f875a90555c 100644 --- a/mozilla/netwerk/cache/src/nsDiskCacheDevice.cpp +++ b/mozilla/netwerk/cache/src/nsDiskCacheDevice.cpp @@ -344,7 +344,7 @@ nsDiskCacheEvictor::VisitRecord(nsDiskCacheRecord * mapRecord) exit: delete clientID; - delete diskEntry; + delete [] (char *)diskEntry; return result; } @@ -620,7 +620,7 @@ nsDiskCacheDevice::FindEntry(nsCString * key) if (nsCRT::strcmp(diskEntry->mKeyStart, key->get()) == 0) { entry = diskEntry->CreateCacheEntry(this); } - delete diskEntry; + delete [] (char *)diskEntry; // If we had a hash collision or CreateCacheEntry failed, return nsnull if (!entry) return nsnull; @@ -895,7 +895,7 @@ public: nsresult rv = mCacheMap->ReadDiskCacheEntry(mapRecord, &diskEntry); if (NS_FAILED(rv)) { mResult = rv; - return kStopVisitingRecords; + return kVisitNextRecord; } // create nsICacheEntryInfo @@ -908,7 +908,7 @@ public: PRBool keepGoing; rv = mVisitor->VisitEntry(DISK_CACHE_DEVICE_ID, entryInfo, &keepGoing); - delete diskEntry; + delete [] (char *)diskEntry; return keepGoing ? kVisitNextRecord : kStopVisitingRecords; } diff --git a/mozilla/netwerk/cache/src/nsDiskCacheEntry.cpp b/mozilla/netwerk/cache/src/nsDiskCacheEntry.cpp index 012378fc18d..05cc50d850b 100644 --- a/mozilla/netwerk/cache/src/nsDiskCacheEntry.cpp +++ b/mozilla/netwerk/cache/src/nsDiskCacheEntry.cpp @@ -128,7 +128,7 @@ CreateDiskCacheEntry(nsDiskCacheBinding * binding) PRUint32 metaSize = 0; nsresult rv = entry->FlattenMetaData(&metaData, &metaSize); if (NS_FAILED(rv)) { - delete diskEntry; + delete [] (char *)diskEntry; return nsnull; } @@ -137,6 +137,12 @@ CreateDiskCacheEntry(nsDiskCacheBinding * binding) nsCRT::memcpy(&diskEntry->mKeyStart[keySize], metaData, metaSize); delete metaData; + + pad -= diskEntry->Size(); + NS_ASSERTION(pad >= 0, "under allocated buffer for diskEntry."); + if (pad > 0) + nsCRT::zero(&diskEntry->mKeyStart[keySize+metaSize], pad); + return diskEntry; } diff --git a/mozilla/netwerk/cache/src/nsDiskCacheMap.cpp b/mozilla/netwerk/cache/src/nsDiskCacheMap.cpp index f9b9b62390b..46df6f0a8e6 100644 --- a/mozilla/netwerk/cache/src/nsDiskCacheMap.cpp +++ b/mozilla/netwerk/cache/src/nsDiskCacheMap.cpp @@ -562,6 +562,8 @@ nsDiskCacheMap::ReadDiskCacheEntry(nsDiskCacheRecord * record, nsDiskCacheEntry PRFileDesc * fd = nsnull; *result = nsnull; + if (!record->MetaLocationInitialized()) return NS_ERROR_NOT_AVAILABLE; + if (metaFile == 0) { // entry/metadata stored in separate file // open and read the file nsCOMPtr file; @@ -614,7 +616,7 @@ nsDiskCacheMap::ReadDiskCacheEntry(nsDiskCacheRecord * record, nsDiskCacheEntry exit: // XXX auto ptr would be nice if (fd) (void) PR_Close(fd); - delete diskEntry; + delete [] (char *)diskEntry; return rv; } @@ -657,7 +659,7 @@ nsDiskCacheMap::WriteDiskCacheEntry(nsDiskCacheBinding * binding) "generations out of sync"); } else { rv = DeleteStorage(&binding->mRecord, nsDiskCache::kMetaData); - if (NS_FAILED(rv)) return rv; + if (NS_FAILED(rv)) goto exit; } } @@ -719,7 +721,7 @@ nsDiskCacheMap::WriteDiskCacheEntry(nsDiskCacheBinding * binding) } exit: - + delete [] (char *)diskEntry; return rv; }