diff --git a/modules/libjar/nsJAR.cpp b/modules/libjar/nsJAR.cpp index 3a40c2dd027f..a342088a72fa 100644 --- a/modules/libjar/nsJAR.cpp +++ b/modules/libjar/nsJAR.cpp @@ -23,8 +23,8 @@ using namespace mozilla; // nsJARManifestItem declaration //---------------------------------------------- /* - * nsJARManifestItem contains meta-information pertaining - * to an individual JAR entry, taken from the + * nsJARManifestItem contains meta-information pertaining + * to an individual JAR entry, taken from the * META-INF/MANIFEST.MF and META-INF/ *.SF files. * This is security-critical information, defined here so it is not * accessible from anywhere else. @@ -41,7 +41,7 @@ class nsJARManifestItem public: JARManifestItemType mType; - // True if the second step of verification (VerifyEntry) + // True if the second step of verification (VerifyEntry) // has taken place: bool entryVerified; @@ -85,8 +85,8 @@ nsJAR::nsJAR(): mZip(new nsZipArchive()), mManifestData(nullptr, nullptr, DeleteManifestEntry, nullptr, 10), mParsedManifest(false), mGlobalStatus(JAR_MANIFEST_NOT_PARSED), - mReleaseTime(PR_INTERVAL_NO_TIMEOUT), - mCache(nullptr), + mReleaseTime(PR_INTERVAL_NO_TIMEOUT), + mCache(nullptr), mLock("nsJAR::mLock"), mTotalItemsInManifest(0), mOpened(false) @@ -102,18 +102,18 @@ NS_IMPL_QUERY_INTERFACE1(nsJAR, nsIZipReader) NS_IMPL_ADDREF(nsJAR) // Custom Release method works with nsZipReaderCache... -nsrefcnt nsJAR::Release(void) +nsrefcnt nsJAR::Release(void) { - nsrefcnt count; - NS_PRECONDITION(0 != mRefCnt, "dup release"); + nsrefcnt count; + NS_PRECONDITION(0 != mRefCnt, "dup release"); count = --mRefCnt; - NS_LOG_RELEASE(this, count, "nsJAR"); + NS_LOG_RELEASE(this, count, "nsJAR"); if (0 == count) { - mRefCnt = 1; /* stabilize */ - /* enable this to find non-threadsafe destructors: */ - /* NS_ASSERT_OWNINGTHREAD(nsJAR); */ + mRefCnt = 1; /* stabilize */ + /* enable this to find non-threadsafe destructors: */ + /* NS_ASSERT_OWNINGTHREAD(nsJAR); */ delete this; - return 0; + return 0; } else if (1 == count && mCache) { #ifdef DEBUG @@ -122,8 +122,8 @@ nsrefcnt nsJAR::Release(void) mCache->ReleaseZip(this); NS_ASSERTION(NS_SUCCEEDED(rv), "failed to release zip file"); } - return count; -} + return count; +} //---------------------------------------------- // nsIZipReader implementation @@ -138,7 +138,7 @@ nsJAR::Open(nsIFile* zipFile) mZipFile = zipFile; mOuterZipEntry.Truncate(); mOpened = true; - + // The omnijar is special, it is opened early on and closed late // this avoids reopening it nsRefPtr zip = mozilla::Omnijar::GetReader(zipFile); @@ -257,7 +257,7 @@ nsJAR::Extract(const nsACString &aEntryName, nsIFile* outFile) return NS_OK; } -NS_IMETHODIMP +NS_IMETHODIMP nsJAR::GetEntry(const nsACString &aEntryName, nsIZipEntry* *result) { nsZipItem* zipItem = mZip->GetItem(PromiseFlatCString(aEntryName).get()); @@ -303,7 +303,7 @@ nsJAR::GetInputStream(const nsACString &aFilename, nsIInputStream** result) } NS_IMETHODIMP -nsJAR::GetInputStreamWithSpec(const nsACString& aJarDirSpec, +nsJAR::GetInputStreamWithSpec(const nsACString& aJarDirSpec, const nsACString &aEntryName, nsIInputStream** result) { NS_ENSURE_ARG_POINTER(result); @@ -388,7 +388,7 @@ nsJAR::GetCertificatePrincipal(const nsACString &aFilename, nsICertificatePrinci return NS_OK; } -NS_IMETHODIMP +NS_IMETHODIMP nsJAR::GetManifestEntriesCount(uint32_t* count) { *count = mTotalItemsInManifest; @@ -406,7 +406,7 @@ nsJAR::GetJarPath(nsACString& aResult) //---------------------------------------------- // nsJAR private implementation //---------------------------------------------- -nsresult +nsresult nsJAR::LoadEntry(const nsACString &aFilename, char** aBuf, uint32_t* aBufLen) { //-- Get a stream for reading the file @@ -414,7 +414,7 @@ nsJAR::LoadEntry(const nsACString &aFilename, char** aBuf, uint32_t* aBufLen) nsCOMPtr manifestStream; rv = GetInputStream(aFilename, getter_AddRefs(manifestStream)); if (NS_FAILED(rv)) return NS_ERROR_FILE_TARGET_DOES_NOT_EXIST; - + //-- Read the manifest file into memory char* buf; uint64_t len64; @@ -426,7 +426,7 @@ nsJAR::LoadEntry(const nsACString &aFilename, char** aBuf, uint32_t* aBufLen) if (!buf) return NS_ERROR_OUT_OF_MEMORY; uint32_t bytesRead; rv = manifestStream->Read(buf, len, &bytesRead); - if (bytesRead != len) + if (bytesRead != len) rv = NS_ERROR_FILE_CORRUPTED; if (NS_FAILED(rv)) { free(buf); @@ -544,7 +544,7 @@ nsJAR::ParseManifest() rv = LoadEntry(manifestFilename, getter_Copies(manifestBuffer), &manifestLen); if (NS_FAILED(rv)) return rv; - + //-- Get its corresponding signature file nsAutoCString sigFilename(manifestFilename); int32_t extension = sigFilename.RFindChar('.') + 1; @@ -569,7 +569,7 @@ nsJAR::ParseManifest() } //-- Get the signature verifier service - nsCOMPtr verifier = + nsCOMPtr verifier = do_GetService(SIGNATURE_VERIFIER_CONTRACTID, &rv); if (NS_FAILED(rv)) // No signature verifier available { @@ -580,7 +580,7 @@ nsJAR::ParseManifest() //-- Verify that the signature file is a valid signature of the SF file int32_t verifyError; - rv = verifier->VerifySignature(sigBuffer, sigLen, manifestBuffer, manifestLen, + rv = verifier->VerifySignature(sigBuffer, sigLen, manifestBuffer, manifestLen, &verifyError, getter_AddRefs(mPrincipal)); if (NS_FAILED(rv)) return rv; if (mPrincipal && verifyError == 0) @@ -592,8 +592,8 @@ nsJAR::ParseManifest() //-- Parse the SF file. If the verification above failed, principal // is null, and ParseOneFile will mark the relevant entries as invalid. - // if ParseOneFile fails, then it has no effect, and we can safely - // continue to the next SF file, or return. + // if ParseOneFile fails, then it has no effect, and we can safely + // continue to the next SF file, or return. ParseOneFile(manifestBuffer, JAR_SF); mParsedManifest = true; @@ -637,20 +637,20 @@ nsJAR::ParseOneFile(const char* filebuf, int16_t aFileType) curPos = nextLineStart; linelen = ReadLine(&nextLineStart); curLine.Assign(curPos, linelen); - if (linelen == 0) + if (linelen == 0) // end of section (blank line or end-of-file) { if (aFileType == JAR_MF) { mTotalItemsInManifest++; if (curItemMF->mType != JAR_INVALID) - { + { //-- Did this section have a name: line? if(!foundName) curItemMF->mType = JAR_INVALID; - else + else { - //-- If it's an internal item, it must correspond + //-- If it's an internal item, it must correspond // to a valid jar entry if (curItemMF->mType == JAR_INTERNAL) { @@ -685,7 +685,7 @@ nsJAR::ParseOneFile(const char* filebuf, int16_t aFileType) return NS_ERROR_OUT_OF_MEMORY; } // (aFileType == JAR_MF) else - //-- file type is SF, compare digest with calculated + //-- file type is SF, compare digest with calculated // section digests from MF file. { if (foundName) @@ -744,7 +744,7 @@ nsJAR::ParseOneFile(const char* filebuf, int16_t aFileType) //-- Lines to look for: // (1) Digest: if (lineName.LowerCaseEqualsLiteral("sha1-digest")) - //-- This is a digest line, save the data in the appropriate place + //-- This is a digest line, save the data in the appropriate place { if(aFileType == JAR_MF) curItemMF->storedEntryDigest = lineData; @@ -752,7 +752,7 @@ nsJAR::ParseOneFile(const char* filebuf, int16_t aFileType) storedSectionDigest = lineData; continue; } - + // (2) Name: associates this manifest section with a file in the jar. if (!foundName && lineName.LowerCaseEqualsLiteral("name")) { @@ -761,7 +761,7 @@ nsJAR::ParseOneFile(const char* filebuf, int16_t aFileType) continue; } - // (3) Magic: this may be an inline Javascript. + // (3) Magic: this may be an inline Javascript. // We can't do any other kind of magic. if (aFileType == JAR_MF && lineName.LowerCaseEqualsLiteral("magic")) { @@ -802,7 +802,7 @@ nsJAR::VerifyEntry(nsJARManifestItem* aManItem, const char* aEntryData, void nsJAR::ReportError(const nsACString &aFilename, int16_t errorCode) { //-- Generate error message - nsAutoString message; + nsAutoString message; message.AssignLiteral("Signature Verification Error: the signature on "); if (!aFilename.IsEmpty()) AppendASCIItoUTF16(aFilename, message); @@ -832,7 +832,7 @@ void nsJAR::ReportError(const nsACString &aFilename, int16_t errorCode) default: message.AppendLiteral("of an unknown problem."); } - + // Report error in JS console nsCOMPtr console(do_GetService("@mozilla.org/consoleservice;1")); if (console) @@ -866,7 +866,7 @@ nsresult nsJAR::CalculateDigest(const char* aInBuf, uint32_t aLen, } NS_IMPL_ISUPPORTS1(nsJAREnumerator, nsIUTF8StringEnumerator) - + //---------------------------------------------- // nsJAREnumerator::HasMore //---------------------------------------------- @@ -1038,10 +1038,10 @@ nsZipReaderCache::nsZipReaderCache() NS_IMETHODIMP nsZipReaderCache::Init(uint32_t cacheSize) { - mCacheSize = cacheSize; - -// Register as a memory pressure observer - nsCOMPtr os = + mCacheSize = cacheSize; + +// Register as a memory pressure observer + nsCOMPtr os = do_GetService("@mozilla.org/observer-service;1"); if (os) { @@ -1068,8 +1068,8 @@ nsZipReaderCache::~nsZipReaderCache() #ifdef ZIP_CACHE_HIT_RATE printf("nsZipReaderCache size=%d hits=%d lookups=%d rate=%f%% flushes=%d missed %d\n", - mCacheSize, mZipCacheHits, mZipCacheLookups, - (float)mZipCacheHits / mZipCacheLookups, + mCacheSize, mZipCacheHits, mZipCacheLookups, + (float)mZipCacheHits / mZipCacheLookups, mZipCacheFlushes, mZipSyncMisses); #endif } @@ -1205,12 +1205,12 @@ FindOldestZip(nsHashKey *aKey, void *aData, void* closure) if (oldest == nullptr || currentReleaseTime < oldest->GetReleaseTime()) { *oldestPtr = current; - } + } } return true; } -struct ZipFindData {nsJAR* zip; bool found;}; +struct ZipFindData {nsJAR* zip; bool found;}; static bool FindZip(nsHashKey *aKey, void *aData, void* closure) @@ -1218,7 +1218,7 @@ FindZip(nsHashKey *aKey, void *aData, void* closure) ZipFindData* find_data = (ZipFindData*)closure; if (find_data->zip == (nsJAR*)aData) { - find_data->found = true; + find_data->found = true; return false; } return true; @@ -1230,20 +1230,20 @@ nsZipReaderCache::ReleaseZip(nsJAR* zip) nsresult rv; MutexAutoLock lock(mLock); - // It is possible that two thread compete for this zip. The dangerous + // It is possible that two thread compete for this zip. The dangerous // case is where one thread Releases the zip and discovers that the ref // count has gone to one. Before it can call this ReleaseZip method // another thread calls our GetZip method. The ref count goes to two. That // second thread then Releases the zip and the ref count goes to one. It // then tries to enter this ReleaseZip method and blocks while the first - // thread is still here. The first thread continues and remove the zip from + // thread is still here. The first thread continues and remove the zip from // the cache and calls its Release method sending the ref count to 0 and // deleting the zip. However, the second thread is still blocked at the // start of ReleaseZip, but the 'zip' param now hold a reference to a // deleted zip! - // + // // So, we are going to try safeguarding here by searching our hashtable while - // locked here for the zip. We return fast if it is not found. + // locked here for the zip. We return fast if it is not found. ZipFindData find_data = {zip, false}; mZips.Enumerate(FindZip, &find_data); @@ -1261,9 +1261,9 @@ nsZipReaderCache::ReleaseZip(nsJAR* zip) nsJAR* oldest = nullptr; mZips.Enumerate(FindOldestZip, &oldest); - + // Because of the craziness above it is possible that there is no zip that - // needs removing. + // needs removing. if (!oldest) return NS_OK; @@ -1302,7 +1302,7 @@ FindFlushableZip(nsHashKey *aKey, void *aData, void* closure) { nsHashKey** flushableKeyPtr = (nsHashKey**)closure; nsJAR* current = (nsJAR*)aData; - + if (current->GetReleaseTime() != PR_INTERVAL_NO_TIMEOUT) { *flushableKeyPtr = aKey; current->SetZipReaderCache(nullptr); @@ -1313,14 +1313,14 @@ FindFlushableZip(nsHashKey *aKey, void *aData, void* closure) NS_IMETHODIMP nsZipReaderCache::Observe(nsISupports *aSubject, - const char *aTopic, + const char *aTopic, const char16_t *aSomeData) { if (strcmp(aTopic, "memory-pressure") == 0) { MutexAutoLock lock(mLock); while (true) { nsHashKey* flushable = nullptr; - mZips.Enumerate(FindFlushableZip, &flushable); + mZips.Enumerate(FindFlushableZip, &flushable); if ( ! flushable ) break; #ifdef DEBUG @@ -1350,7 +1350,7 @@ nsZipReaderCache::Observe(nsISupports *aSubject, uri.Insert(NS_LITERAL_CSTRING("file:"), 0); nsCStringKey key(uri); - MutexAutoLock lock(mLock); + MutexAutoLock lock(mLock); nsJAR* zip = static_cast(static_cast(mZips.Get(&key))); if (!zip) return NS_OK; diff --git a/modules/libjar/nsJAR.h b/modules/libjar/nsJAR.h index 8eda159f5b44..cc4b361a327d 100644 --- a/modules/libjar/nsJAR.h +++ b/modules/libjar/nsJAR.h @@ -47,9 +47,9 @@ typedef enum } JARManifestStatusType; /*------------------------------------------------------------------------- - * Class nsJAR declaration. - * nsJAR serves as an XPCOM wrapper for nsZipArchive with the addition of - * JAR manifest file parsing. + * Class nsJAR declaration. + * nsJAR serves as an XPCOM wrapper for nsZipArchive with the addition of + * JAR manifest file parsing. *------------------------------------------------------------------------*/ class nsJAR : public nsIZipReader { @@ -62,9 +62,9 @@ class nsJAR : public nsIZipReader nsJAR(); virtual ~nsJAR(); - + NS_DEFINE_STATIC_CID_ACCESSOR( NS_ZIPREADER_CID ) - + NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIZIPREADER @@ -74,7 +74,7 @@ class nsJAR : public nsIZipReader PRIntervalTime GetReleaseTime() { return mReleaseTime; } - + bool IsReleased() { return mReleaseTime != PR_INTERVAL_NO_TIMEOUT; } @@ -82,11 +82,11 @@ class nsJAR : public nsIZipReader void SetReleaseTime() { mReleaseTime = PR_IntervalNow(); } - + void ClearReleaseTime() { mReleaseTime = PR_INTERVAL_NO_TIMEOUT; } - + void SetZipReaderCache(nsZipReaderCache* cache) { mCache = cache; } @@ -102,18 +102,18 @@ class nsJAR : public nsIZipReader int16_t mGlobalStatus; // Global signature verification status PRIntervalTime mReleaseTime; // used by nsZipReaderCache for flushing entries nsZipReaderCache* mCache; // if cached, this points to the cache it's contained in - mozilla::Mutex mLock; + mozilla::Mutex mLock; int64_t mMtime; int32_t mTotalItemsInManifest; bool mOpened; nsresult ParseManifest(); void ReportError(const nsACString &aFilename, int16_t errorCode); - nsresult LoadEntry(const nsACString &aFilename, char** aBuf, + nsresult LoadEntry(const nsACString &aFilename, char** aBuf, uint32_t* aBufLen = nullptr); - int32_t ReadLine(const char** src); + int32_t ReadLine(const char** src); nsresult ParseOneFile(const char* filebuf, int16_t aFileType); - nsresult VerifyEntry(nsJARManifestItem* aEntry, const char* aEntryData, + nsresult VerifyEntry(nsJARManifestItem* aEntry, const char* aEntryData, uint32_t aLen); nsresult CalculateDigest(const char* aInBuf, uint32_t aInBufLen, @@ -131,7 +131,7 @@ class nsJARItem : public nsIZipEntry public: NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIZIPENTRY - + nsJARItem(nsZipItem* aZipItem); virtual ~nsJARItem() {} @@ -142,14 +142,14 @@ private: PRTime mLastModTime; uint16_t mCompression; uint32_t mPermissions; - bool mIsDirectory; + bool mIsDirectory; bool mIsSynthetic; }; /** * nsJAREnumerator * - * Enumerates a list of files in a zip archive + * Enumerates a list of files in a zip archive * (based on a pattern match in its member nsZipFind). */ class nsJAREnumerator MOZ_FINAL : public nsIUTF8StringEnumerator @@ -158,7 +158,7 @@ public: NS_DECL_THREADSAFE_ISUPPORTS NS_DECL_NSIUTF8STRINGENUMERATOR - nsJAREnumerator(nsZipFind *aFind) : mFind(aFind), mName(nullptr) { + nsJAREnumerator(nsZipFind *aFind) : mFind(aFind), mName(nullptr) { NS_ASSERTION(mFind, "nsJAREnumerator: Missing zipFind."); }