diff options
Diffstat (limited to 'modules/libjar')
-rw-r--r-- | modules/libjar/nsJAR.cpp | 39 | ||||
-rw-r--r-- | modules/libjar/nsZipArchive.cpp | 15 | ||||
-rw-r--r-- | modules/libjar/nsZipArchive.h | 4 |
3 files changed, 44 insertions, 14 deletions
diff --git a/modules/libjar/nsJAR.cpp b/modules/libjar/nsJAR.cpp index 96e18e1d31..a9a696cf75 100644 --- a/modules/libjar/nsJAR.cpp +++ b/modules/libjar/nsJAR.cpp @@ -271,11 +271,7 @@ nsJAR::Extract(const nsACString &aEntryName, nsIFile* outFile) if (NS_FAILED(rv)) return rv; // ExtractFile also closes the fd handle and resolves the symlink if needed - nsAutoCString path; - rv = outFile->GetNativePath(path); - if (NS_FAILED(rv)) return rv; - - rv = mZip->ExtractFile(item, path.get(), fd); + rv = mZip->ExtractFile(item, outFile, fd); } if (NS_FAILED(rv)) return rv; @@ -422,7 +418,11 @@ nsJAR::GetJarPath(nsACString& aResult) { NS_ENSURE_ARG_POINTER(mZipFile); +#ifdef XP_WIN + return mZipFile->GetPersistentDescriptor(aResult); +#else return mZipFile->GetNativePath(aResult); +#endif } nsresult @@ -1124,7 +1124,11 @@ nsZipReaderCache::IsCached(nsIFile* zipFile, bool* aResult) MutexAutoLock lock(mLock); nsAutoCString uri; +#ifdef XP_WIN + rv = zipFile->GetPersistentDescriptor(uri); +#else rv = zipFile->GetNativePath(uri); +#endif if (NS_FAILED(rv)) return rv; @@ -1146,8 +1150,14 @@ nsZipReaderCache::GetZip(nsIFile* zipFile, nsIZipReader* *result) #endif nsAutoCString uri; +#ifdef XP_WIN + rv = zipFile->GetPersistentDescriptor(uri); +#else rv = zipFile->GetNativePath(uri); - if (NS_FAILED(rv)) return rv; +#endif + if (NS_FAILED(rv)) { + return rv; + } uri.Insert(NS_LITERAL_CSTRING("file:"), 0); @@ -1190,8 +1200,14 @@ nsZipReaderCache::GetInnerZip(nsIFile* zipFile, const nsACString &entry, #endif nsAutoCString uri; +#ifdef XP_WIN + rv = zipFile->GetPersistentDescriptor(uri); +#else rv = zipFile->GetNativePath(uri); - if (NS_FAILED(rv)) return rv; +#endif + if (NS_FAILED(rv)) { + return rv; + } uri.Insert(NS_LITERAL_CSTRING("jar:"), 0); uri.AppendLiteral("!/"); @@ -1233,7 +1249,11 @@ nsZipReaderCache::GetFd(nsIFile* zipFile, PRFileDesc** aRetVal) nsresult rv; nsAutoCString uri; +#ifdef XP_WIN + rv = zipFile->GetPersistentDescriptor(uri); +#else rv = zipFile->GetNativePath(uri); +#endif if (NS_FAILED(rv)) { return rv; } @@ -1374,8 +1394,13 @@ nsZipReaderCache::Observe(nsISupports *aSubject, return NS_OK; nsAutoCString uri; +#ifdef XP_WIN + if (NS_FAILED(file->GetPersistentDescriptor(uri))) + return NS_OK; +#else if (NS_FAILED(file->GetNativePath(uri))) return NS_OK; +#endif uri.Insert(NS_LITERAL_CSTRING("file:"), 0); diff --git a/modules/libjar/nsZipArchive.cpp b/modules/libjar/nsZipArchive.cpp index b28fddc181..8006ee56c0 100644 --- a/modules/libjar/nsZipArchive.cpp +++ b/modules/libjar/nsZipArchive.cpp @@ -486,7 +486,7 @@ MOZ_WIN_MEM_TRY_CATCH(return nullptr) // On extraction error(s) it removes the file. // When needed, it also resolves the symlink. //--------------------------------------------- -nsresult nsZipArchive::ExtractFile(nsZipItem *item, const char *outname, +nsresult nsZipArchive::ExtractFile(nsZipItem *item, nsIFile* outFile, PRFileDesc* aFd) { if (!item) @@ -524,11 +524,16 @@ nsresult nsZipArchive::ExtractFile(nsZipItem *item, const char *outname, //-- delete the file on errors, or resolve symlink if needed if (aFd) { PR_Close(aFd); - if (rv != NS_OK) - PR_Delete(outname); + if (NS_FAILED(rv) && outFile) { + outFile->Remove(false); + } #ifdef XP_UNIX - else if (item->IsSymlink()) - rv = ResolveSymlink(outname); + else if (item->IsSymlink()) { + nsAutoCString path; + rv = outFile->GetNativePath(path); + if (NS_FAILED(rv)) return rv; + rv = ResolveSymlink(path.get()); + } #endif } diff --git a/modules/libjar/nsZipArchive.h b/modules/libjar/nsZipArchive.h index 6b758c9fd8..133a2aa120 100644 --- a/modules/libjar/nsZipArchive.h +++ b/modules/libjar/nsZipArchive.h @@ -159,10 +159,10 @@ public: * * @param zipEntry Name of file in archive to extract * @param outFD Filedescriptor to write contents to - * @param outname Name of file to write to + * @param outFile Handle of file to write to * @return status code */ - nsresult ExtractFile(nsZipItem * zipEntry, const char *outname, PRFileDesc * outFD); + nsresult ExtractFile(nsZipItem * zipEntry, nsIFile* outFile, PRFileDesc * outFD); /** * FindInit |