From 7ab72cf96a134d11c93960da38f3434d32de7230 Mon Sep 17 00:00:00 2001 From: Valentin Gosu Date: Wed, 12 Feb 2025 14:38:27 +0000 Subject: [PATCH] Bug 1940027 - Use nsACString in jar code a=dmeehan Differential Revision: https://phabricator.services.mozilla.com/D237704 --- dom/xhr/XMLHttpRequestMainThread.cpp | 2 +- gfx/thebes/gfxFT2FontList.cpp | 6 ++--- intl/hyphenation/glue/nsHyphenator.cpp | 2 +- intl/locale/LocaleService.cpp | 2 +- js/xpconnect/loader/URLPreloader.cpp | 6 ++--- modules/libjar/nsJAR.cpp | 14 +++++----- modules/libjar/nsJARInputStream.cpp | 3 ++- modules/libjar/nsZipArchive.cpp | 27 ++++++++++--------- modules/libjar/nsZipArchive.h | 13 +++++---- .../extensions/AddonManagerStartup.cpp | 2 +- xpcom/build/FileLocation.cpp | 22 +++++++-------- xpcom/build/FileLocation.h | 10 +++---- xpcom/build/Omnijar.cpp | 5 ++-- xpcom/components/nsComponentManager.cpp | 10 +++---- 14 files changed, 64 insertions(+), 60 deletions(-) diff --git a/dom/xhr/XMLHttpRequestMainThread.cpp b/dom/xhr/XMLHttpRequestMainThread.cpp index f0ce577211d1..c29b050c9c71 100644 --- a/dom/xhr/XMLHttpRequestMainThread.cpp +++ b/dom/xhr/XMLHttpRequestMainThread.cpp @@ -4165,7 +4165,7 @@ nsresult ArrayBufferBuilder::MapToFileInPackage(const nsCString& aFile, if (!zip) { return NS_ERROR_FAILURE; } - nsZipItem* zipItem = zip->GetItem(aFile.get()); + nsZipItem* zipItem = zip->GetItem(aFile); if (!zipItem) { return NS_ERROR_FILE_NOT_FOUND; } diff --git a/gfx/thebes/gfxFT2FontList.cpp b/gfx/thebes/gfxFT2FontList.cpp index 2eba69dc6c94..bc155ea9a5fa 100644 --- a/gfx/thebes/gfxFT2FontList.cpp +++ b/gfx/thebes/gfxFT2FontList.cpp @@ -103,7 +103,7 @@ already_AddRefed FT2FontEntry::GetFTFace(bool aCommit) { RefPtr face; if (mFilename[0] != '/') { RefPtr reader = Omnijar::GetReader(Omnijar::Type::GRE); - nsZipItem* item = reader->GetItem(mFilename.get()); + nsZipItem* item = reader->GetItem(mFilename); NS_ASSERTION(item, "failed to find zip entry"); uint32_t bufSize = item->RealSize(); @@ -468,7 +468,7 @@ hb_face_t* FT2FontEntry::CreateHBFace() const { // A relative path means an omnijar resource, which we may need to // decompress to a temporary buffer. RefPtr reader = Omnijar::GetReader(Omnijar::Type::GRE); - nsZipItem* item = reader->GetItem(mFilename.get()); + nsZipItem* item = reader->GetItem(mFilename); MOZ_ASSERT(item, "failed to find zip entry"); if (item) { // TODO(jfkthame): @@ -1507,7 +1507,7 @@ void gfxFT2FontList::AppendFacesFromOmnijarEntry(nsZipArchive* aArchive, } } - nsZipItem* item = aArchive->GetItem(aEntryName.get()); + nsZipItem* item = aArchive->GetItem(aEntryName); NS_ASSERTION(item, "failed to find zip entry"); uint32_t bufSize = item->RealSize(); diff --git a/intl/hyphenation/glue/nsHyphenator.cpp b/intl/hyphenation/glue/nsHyphenator.cpp index 129f30f9d550..aaa121d94446 100644 --- a/intl/hyphenation/glue/nsHyphenator.cpp +++ b/intl/hyphenation/glue/nsHyphenator.cpp @@ -52,7 +52,7 @@ static const void* GetItemPtrFromJarURI(nsIJARURI* aJAR, uint32_t* aLength) { if (archive) { nsCString path; aJAR->GetJAREntry(path); - nsZipItem* item = archive->GetItem(path.get()); + nsZipItem* item = archive->GetItem(path); if (item && item->Compression() == 0 && item->Size() > 0) { // We do NOT own this data, but it won't go away until the omnijar // file is closed during shutdown. diff --git a/intl/locale/LocaleService.cpp b/intl/locale/LocaleService.cpp index 1527f2791037..7cb42fbb11ca 100644 --- a/intl/locale/LocaleService.cpp +++ b/intl/locale/LocaleService.cpp @@ -338,7 +338,7 @@ static bool GetGREFileContents(const char* aFilePath, nsCString* aOutString) { // Look for the requested file in omnijar. RefPtr zip = Omnijar::GetReader(Omnijar::GRE); if (zip) { - nsZipItemPtr item(zip, aFilePath); + nsZipItemPtr item(zip, nsDependentCString(aFilePath)); if (!item) { return false; } diff --git a/js/xpconnect/loader/URLPreloader.cpp b/js/xpconnect/loader/URLPreloader.cpp index ad7354e5a0ff..c0a773f0ea7b 100644 --- a/js/xpconnect/loader/URLPreloader.cpp +++ b/js/xpconnect/loader/URLPreloader.cpp @@ -402,7 +402,7 @@ void URLPreloader::BackgroundReadFiles() { entry->TypeString(), entry->mPath.get()); } - auto item = zip->GetItem(entry->mPath.get()); + auto item = zip->GetItem(entry->mPath); if (!item) { entry->mResultCode = NS_ERROR_FILE_NOT_FOUND; continue; @@ -567,7 +567,7 @@ Result URLPreloader::ReadURIInternal(nsIURI* uri, } // Not an Omnijar archive, so just read it directly. - FileLocation location(zip, PromiseFlatCString(path).BeginReading()); + FileLocation location(zip, path); return URLEntry::ReadLocation(location); } @@ -636,7 +636,7 @@ Result URLPreloader::CacheKey::ToFileLocation() { } RefPtr zip = Archive(); - return FileLocation(zip, mPath.get()); + return FileLocation(zip, mPath); } Result URLPreloader::URLEntry::Read() { diff --git a/modules/libjar/nsJAR.cpp b/modules/libjar/nsJAR.cpp index 41e8334e703f..0610d11f1cbd 100644 --- a/modules/libjar/nsJAR.cpp +++ b/modules/libjar/nsJAR.cpp @@ -135,8 +135,7 @@ nsJAR::OpenInner(nsIZipReader* aZipReader, const nsACString& aZipEntry) { { nsJAR* outerJAR = static_cast(aZipReader); RecursiveMutexAutoLock outerLock(outerJAR->mLock); - rv = nsZipHandle::Init(outerJAR->mZip.get(), - PromiseFlatCString(aZipEntry).get(), + rv = nsZipHandle::Init(outerJAR->mZip.get(), aZipEntry, getter_AddRefs(handle)); NS_ENSURE_SUCCESS(rv, rv); } @@ -191,8 +190,7 @@ nsJAR::Test(const nsACString& aEntryName) { if (!mZip) { return NS_ERROR_FAILURE; } - return mZip->Test( - aEntryName.IsEmpty() ? nullptr : PromiseFlatCString(aEntryName).get()); + return mZip->Test(aEntryName); } NS_IMETHODIMP @@ -205,7 +203,7 @@ nsJAR::Extract(const nsACString& aEntryName, nsIFile* outFile) { } LOG(("Extract[%p] %s", this, PromiseFlatCString(aEntryName).get())); - nsZipItem* item = mZip->GetItem(PromiseFlatCString(aEntryName).get()); + nsZipItem* item = mZip->GetItem(aEntryName); NS_ENSURE_TRUE(item, NS_ERROR_FILE_NOT_FOUND); // Remove existing file or directory so we set permissions correctly. @@ -245,7 +243,7 @@ nsJAR::GetEntry(const nsACString& aEntryName, nsIZipEntry** result) { if (!mZip) { return NS_ERROR_FAILURE; } - nsZipItem* zipItem = mZip->GetItem(PromiseFlatCString(aEntryName).get()); + nsZipItem* zipItem = mZip->GetItem(aEntryName); NS_ENSURE_TRUE(zipItem, NS_ERROR_FILE_NOT_FOUND); nsJARItem* jarItem = new nsJARItem(zipItem); @@ -261,7 +259,7 @@ nsJAR::HasEntry(const nsACString& aEntryName, bool* result) { if (!mZip) { return NS_ERROR_FAILURE; } - *result = mZip->GetItem(PromiseFlatCString(aEntryName).get()) != nullptr; + *result = mZip->GetItem(aEntryName) != nullptr; return NS_OK; } @@ -300,7 +298,7 @@ nsJAR::GetInputStream(const nsACString& aEntryName, nsIInputStream** result) { const nsCString& entry = PromiseFlatCString(aEntryName); if (*entry.get()) { // First check if item exists in jar - item = mZip->GetItem(entry.get()); + item = mZip->GetItem(entry); if (!item) return NS_ERROR_FILE_NOT_FOUND; } nsJARInputStream* jis = new nsJARInputStream(); diff --git a/modules/libjar/nsJARInputStream.cpp b/modules/libjar/nsJARInputStream.cpp index ed29d67295de..5470841f9b30 100644 --- a/modules/libjar/nsJARInputStream.cpp +++ b/modules/libjar/nsJARInputStream.cpp @@ -342,7 +342,8 @@ nsresult nsJARInputStream::ReadDirectory(char* aBuffer, uint32_t aCount, const char* entryName = mArray[mArrPos].get(); uint32_t entryNameLen = mArray[mArrPos].Length(); - nsZipItem* ze = mJar->mZip->GetItem(entryName); + nsZipItem* ze = mJar->mZip->GetItem( + nsDependentCString(mArray[mArrPos].get(), mArray[mArrPos].Length())); NS_ENSURE_TRUE(ze, NS_ERROR_FILE_NOT_FOUND); // Last Modified Time diff --git a/modules/libjar/nsZipArchive.cpp b/modules/libjar/nsZipArchive.cpp index 2d845f25f0a1..fe670018f76b 100644 --- a/modules/libjar/nsZipArchive.cpp +++ b/modules/libjar/nsZipArchive.cpp @@ -237,12 +237,12 @@ nsresult nsZipHandle::Init(nsIFile* file, nsZipHandle** ret, PRFileDesc** aFd) { return NS_OK; } -nsresult nsZipHandle::Init(nsZipArchive* zip, const char* entry, +nsresult nsZipHandle::Init(nsZipArchive* zip, const nsACString& entry, nsZipHandle** ret) { RefPtr handle = new nsZipHandle(); if (!handle) return NS_ERROR_OUT_OF_MEMORY; - LOG(("ZipHandle::Init entry %s", entry)); + LOG(("ZipHandle::Init entry %s", PromiseFlatCString(entry).get())); nsZipItem* item = zip->GetItem(entry); if (item && item->Compression() == DEFLATED && @@ -414,10 +414,10 @@ already_AddRefed nsZipArchive::OpenArchive(nsIFile* aFile) { //--------------------------------------------- // nsZipArchive::Test //--------------------------------------------- -nsresult nsZipArchive::Test(const char* aEntryName) { +nsresult nsZipArchive::Test(const nsACString& aEntryName) { nsZipItem* currItem; - if (aEntryName) // only test specified item + if (aEntryName.Length()) // only test specified item { currItem = GetItem(aEntryName); if (!currItem) return NS_ERROR_FILE_NOT_FOUND; @@ -442,12 +442,13 @@ nsresult nsZipArchive::Test(const char* aEntryName) { //--------------------------------------------- // nsZipArchive::GetItem //--------------------------------------------- -nsZipItem* nsZipArchive::GetItem(const char* aEntryName) { +nsZipItem* nsZipArchive::GetItem(const nsACString& aEntryName) { MutexAutoLock lock(mLock); - LOG(("ZipHandle::GetItem[%p] %s", this, aEntryName)); - if (aEntryName) { - uint32_t len = strlen(aEntryName); + LOG(("ZipHandle::GetItem[%p] %s", this, + PromiseFlatCString(aEntryName).get())); + if (aEntryName.Length()) { + uint32_t len = aEntryName.Length(); //-- If the request is for a directory, make sure that synthetic entries //-- are created for the directories without their own entry. if (!mBuiltSynthetics) { @@ -456,14 +457,14 @@ nsZipItem* nsZipArchive::GetItem(const char* aEntryName) { } } MMAP_FAULT_HANDLER_BEGIN_HANDLE(mFd) - nsZipItem* item = mFiles[HashName(aEntryName, len)]; + nsZipItem* item = mFiles[HashName(aEntryName.BeginReading(), len)]; while (item) { if ((len == item->nameLength) && - (!memcmp(aEntryName, item->Name(), len))) { + (!memcmp(aEntryName.BeginReading(), item->Name(), len))) { // Successful GetItem() is a good indicator that the file is about to be // read if (mUseZipLog && mURI.Length()) { - zipLog.Write(mURI, aEntryName); + zipLog.Write(mURI, aEntryName.BeginReading()); } return item; //-- found it } @@ -1202,8 +1203,8 @@ uint8_t* nsZipCursor::ReadOrCopy(uint32_t* aBytesRead, bool aCopy) { return buf; } -nsZipItemPtr_base::nsZipItemPtr_base(nsZipArchive* aZip, const char* aEntryName, - bool doCRC) +nsZipItemPtr_base::nsZipItemPtr_base(nsZipArchive* aZip, + const nsACString& aEntryName, bool doCRC) : mReturnBuf(nullptr), mReadlen(0) { // make sure the ziparchive hangs around mZipHandle = aZip->GetFD(); diff --git a/modules/libjar/nsZipArchive.h b/modules/libjar/nsZipArchive.h index 12e4b7ea0024..c12c0d8f0df5 100644 --- a/modules/libjar/nsZipArchive.h +++ b/modules/libjar/nsZipArchive.h @@ -116,14 +116,14 @@ class nsZipArchive final { * * @return status code */ - nsresult Test(const char* aEntryName); + nsresult Test(const nsACString& aEntryName); /** * GetItem * @param aEntryName Name of file in the archive * @return pointer to nsZipItem */ - nsZipItem* GetItem(const char* aEntryName); + nsZipItem* GetItem(const nsACString& aEntryName); /** * ExtractFile @@ -303,7 +303,8 @@ class nsZipItemPtr_base { * @param aEntryName Archive membername * @param doCRC When set to true Read() will check crc */ - nsZipItemPtr_base(nsZipArchive* aZip, const char* aEntryName, bool doCRC); + nsZipItemPtr_base(nsZipArchive* aZip, const nsACString& aEntryName, + bool doCRC); uint32_t Length() const { return mReadlen; } @@ -321,7 +322,8 @@ class nsZipItemPtr final : public nsZipItemPtr_base { " a number of assumptions."); public: - nsZipItemPtr(nsZipArchive* aZip, const char* aEntryName, bool doCRC = false) + nsZipItemPtr(nsZipArchive* aZip, const nsACString& aEntryName, + bool doCRC = false) : nsZipItemPtr_base(aZip, aEntryName, doCRC) {} /** * @return buffer containing the whole zip member or nullptr on error. @@ -363,7 +365,8 @@ class nsZipHandle final { public: static nsresult Init(nsIFile* file, nsZipHandle** ret, PRFileDesc** aFd = nullptr); - static nsresult Init(nsZipArchive* zip, const char* entry, nsZipHandle** ret); + static nsresult Init(nsZipArchive* zip, const nsACString& entry, + nsZipHandle** ret); static nsresult Init(const uint8_t* aData, uint32_t aLen, nsZipHandle** aRet); NS_METHOD_(MozExternalRefCountType) AddRef(void); diff --git a/toolkit/mozapps/extensions/AddonManagerStartup.cpp b/toolkit/mozapps/extensions/AddonManagerStartup.cpp index 40d7c6ddafee..893551e50886 100644 --- a/toolkit/mozapps/extensions/AddonManagerStartup.cpp +++ b/toolkit/mozapps/extensions/AddonManagerStartup.cpp @@ -258,7 +258,7 @@ static Result GetFileLocation(nsIURI* uri) { MOZ_TRY_VAR(file, GetFile(fileURI)); - location.Init(file, entry.get()); + location.Init(file, entry); } return std::move(location); diff --git a/xpcom/build/FileLocation.cpp b/xpcom/build/FileLocation.cpp index 5162546f1d49..7e24af140e26 100644 --- a/xpcom/build/FileLocation.cpp +++ b/xpcom/build/FileLocation.cpp @@ -18,11 +18,11 @@ FileLocation::~FileLocation() = default; FileLocation::FileLocation(nsIFile* aFile) { Init(aFile); } -FileLocation::FileLocation(nsIFile* aFile, const char* aPath) { +FileLocation::FileLocation(nsIFile* aFile, const nsACString& aPath) { Init(aFile, aPath); } -FileLocation::FileLocation(nsZipArchive* aZip, const char* aPath) { +FileLocation::FileLocation(nsZipArchive* aZip, const nsACString& aPath) { Init(aZip, aPath); } @@ -37,14 +37,14 @@ FileLocation::FileLocation(FileLocation&& aOther) aOther.mPath.Truncate(); } -FileLocation::FileLocation(const FileLocation& aFile, const char* aPath) { +FileLocation::FileLocation(const FileLocation& aFile, const nsACString& aPath) { if (aFile.IsZip()) { if (aFile.mBaseFile) { - Init(aFile.mBaseFile, aFile.mPath.get()); + Init(aFile.mBaseFile, aFile.mPath); } else { - Init(aFile.mBaseZip, aFile.mPath.get()); + Init(aFile.mBaseZip, aFile.mPath); } - if (aPath) { + if (aPath.Length()) { int32_t i = mPath.RFindChar('/'); if (kNotFound == i) { mPath.Truncate(0); @@ -54,7 +54,7 @@ FileLocation::FileLocation(const FileLocation& aFile, const char* aPath) { mPath += aPath; } } else { - if (aPath) { + if (aPath.Length()) { nsCOMPtr cfile; aFile.mBaseFile->GetParent(getter_AddRefs(cfile)); @@ -69,7 +69,7 @@ FileLocation::FileLocation(const FileLocation& aFile, const char* aPath) { } cfile->AppendRelativeNativePath(pathStr); #else - cfile->AppendRelativeNativePath(nsDependentCString(aPath)); + cfile->AppendRelativeNativePath(aPath); #endif Init(cfile); } else { @@ -84,13 +84,13 @@ void FileLocation::Init(nsIFile* aFile) { mPath.Truncate(); } -void FileLocation::Init(nsIFile* aFile, const char* aPath) { +void FileLocation::Init(nsIFile* aFile, const nsACString& aPath) { mBaseZip = nullptr; mBaseFile = aFile; mPath = aPath; } -void FileLocation::Init(nsZipArchive* aZip, const char* aPath) { +void FileLocation::Init(nsZipArchive* aZip, const nsACString& aPath) { mBaseZip = aZip; mBaseFile = nullptr; mPath = aPath; @@ -158,7 +158,7 @@ nsresult FileLocation::GetData(Data& aData) { aData.mZip = nsZipArchive::OpenArchive(mBaseFile); } if (aData.mZip) { - aData.mItem = aData.mZip->GetItem(mPath.get()); + aData.mItem = aData.mZip->GetItem(mPath); if (aData.mItem) { return NS_OK; } diff --git a/xpcom/build/FileLocation.h b/xpcom/build/FileLocation.h index 0988a9595ffb..3f6402bd8e34 100644 --- a/xpcom/build/FileLocation.h +++ b/xpcom/build/FileLocation.h @@ -47,23 +47,23 @@ class FileLocation { * Constructors for path within an archive. The archive can be given either * as nsIFile or nsZipArchive. */ - FileLocation(nsIFile* aZip, const char* aPath); + FileLocation(nsIFile* aZip, const nsACString& aPath); - FileLocation(nsZipArchive* aZip, const char* aPath); + FileLocation(nsZipArchive* aZip, const nsACString& aPath); /** * Creates a new file location relative to another one. */ - FileLocation(const FileLocation& aFile, const char* aPath); + FileLocation(const FileLocation& aFile, const nsACString& aPath); /** * Initialization functions corresponding to constructors */ void Init(nsIFile* aFile); - void Init(nsIFile* aZip, const char* aPath); + void Init(nsIFile* aZip, const nsACString& aPath); - void Init(nsZipArchive* aZip, const char* aPath); + void Init(nsZipArchive* aZip, const nsACString& aPath); /** * Returns an URI string corresponding to the file location diff --git a/xpcom/build/Omnijar.cpp b/xpcom/build/Omnijar.cpp index a816cc083f09..18f1580c9ab8 100644 --- a/xpcom/build/Omnijar.cpp +++ b/xpcom/build/Omnijar.cpp @@ -36,6 +36,7 @@ void Omnijar::CleanUpOne(Type aType) { } void Omnijar::InitOne(nsIFile* aPath, Type aType) { + constexpr auto kOmnijarName = nsLiteralCString{MOZ_STRINGIFY(OMNIJAR_NAME)}; nsCOMPtr file; if (aPath) { file = aPath; @@ -83,8 +84,8 @@ void Omnijar::InitOne(nsIFile* aPath, Type aType) { RefPtr outerReader; RefPtr handle; - if (NS_SUCCEEDED(nsZipHandle::Init(zipReader, MOZ_STRINGIFY(OMNIJAR_NAME), - getter_AddRefs(handle)))) { + if (NS_SUCCEEDED( + nsZipHandle::Init(zipReader, kOmnijarName, getter_AddRefs(handle)))) { outerReader = zipReader; zipReader = nsZipArchive::OpenArchive(handle); if (!zipReader) { diff --git a/xpcom/components/nsComponentManager.cpp b/xpcom/components/nsComponentManager.cpp index 515fc82312b2..1d4b683ecc45 100644 --- a/xpcom/components/nsComponentManager.cpp +++ b/xpcom/components/nsComponentManager.cpp @@ -399,7 +399,7 @@ nsresult nsComponentManagerImpl::Init() { RefPtr greOmnijar = mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE); if (greOmnijar) { - cl->location.Init(greOmnijar, "chrome.manifest"); + cl->location.Init(greOmnijar, "chrome.manifest"_ns); } else { nsCOMPtr lf = CloneAndAppend(greDir, "chrome.manifest"_ns); cl->location.Init(lf); @@ -410,7 +410,7 @@ nsresult nsComponentManagerImpl::Init() { if (appOmnijar) { cl = sModuleLocations->AppendElement(); cl->type = NS_APP_LOCATION; - cl->location.Init(appOmnijar, "chrome.manifest"); + cl->location.Init(appOmnijar, "chrome.manifest"_ns); } else { bool equals = false; appDir->Equals(greDir, &equals); @@ -524,7 +524,7 @@ void nsComponentManagerImpl::RegisterManifest(NSLocationType aType, void nsComponentManagerImpl::ManifestManifest(ManifestProcessingContext& aCx, int aLineNo, char* const* aArgv) { char* file = aArgv[0]; - FileLocation f(aCx.mFile, file); + FileLocation f(aCx.mFile, nsDependentCString(file)); RegisterManifest(aCx.mType, f, aCx.mChromeOnly); } @@ -1458,7 +1458,7 @@ nsComponentManagerImpl::RemoveBootstrappedManifestLocation(nsIFile* aLocation) { elem.type = NS_BOOTSTRAPPED_LOCATION; if (Substring(path, path.Length() - 4).EqualsLiteral(".xpi")) { - elem.location.Init(aLocation, "chrome.manifest"); + elem.location.Init(aLocation, "chrome.manifest"_ns); } else { nsCOMPtr lf = CloneAndAppend(aLocation, "chrome.manifest"_ns); elem.location.Init(lf); @@ -1541,7 +1541,7 @@ XRE_AddJarManifestLocation(NSLocationType aType, nsIFile* aLocation) { nsComponentManagerImpl::sModuleLocations->AppendElement(); c->type = aType; - c->location.Init(aLocation, "chrome.manifest"); + c->location.Init(aLocation, "chrome.manifest"_ns); if (nsComponentManagerImpl::gComponentManager && nsComponentManagerImpl::NORMAL ==