From 9bb0642ffd50e007f3e2ae1358143aab65d572f5 Mon Sep 17 00:00:00 2001 From: "dbaron%dbaron.org" Date: Fri, 27 Aug 2004 21:39:33 +0000 Subject: [PATCH] Fix issues with extraction of file permissions, especially in standalone. b=231083, 235781 r+sr=dveditz a=asa git-svn-id: svn://10.0.0.236/branches/AVIARY_1_0_20040515_BRANCH@161405 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/modules/libjar/nsJAR.cpp | 26 ++++++++++------ mozilla/modules/libjar/nsZipArchive.cpp | 41 +++++++++++++++---------- mozilla/modules/libjar/nsZipArchive.h | 3 +- mozilla/modules/libjar/zipstub.h | 2 +- 4 files changed, 42 insertions(+), 30 deletions(-) diff --git a/mozilla/modules/libjar/nsJAR.cpp b/mozilla/modules/libjar/nsJAR.cpp index ee44ad75e2f..9e2c0ecfa11 100644 --- a/mozilla/modules/libjar/nsJAR.cpp +++ b/mozilla/modules/libjar/nsJAR.cpp @@ -217,7 +217,7 @@ nsJAR::Open() nsCOMPtr localFile = do_QueryInterface(mZipFile, &rv); if (NS_FAILED(rv)) return rv; - rv = localFile->OpenNSPRFileDesc(PR_RDONLY, 0664, &mFd); + rv = localFile->OpenNSPRFileDesc(PR_RDONLY, 0000, &mFd); if (NS_FAILED(rv)) return rv; PRInt32 err = mZip.OpenArchiveWithFileDesc(mFd); @@ -259,12 +259,19 @@ nsJAR::Extract(const char *zipEntry, nsIFile* outFile) nsCOMPtr localFile = do_QueryInterface(outFile, &rv); if (NS_FAILED(rv)) return rv; + nsZipItem *item = 0; + PRInt32 err = mZip.GetItem(zipEntry, &item); + if (err != ZIP_OK) + return ziperr2nsresult(err); + + // Remove existing file so we set permissions correctly. + localFile->Remove(PR_FALSE); + PRFileDesc* fd; - rv = localFile->OpenNSPRFileDesc(PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE, 0664, &fd); + rv = localFile->OpenNSPRFileDesc(PR_WRONLY | PR_CREATE_FILE, item->mode, &fd); if (NS_FAILED(rv)) return NS_ERROR_FILE_ACCESS_DENIED; - nsZipItem *item = 0; - PRInt32 err = mZip.ExtractFileToFileDesc(zipEntry, fd, &item, mFd); + err = mZip.ExtractItemToFileDesc(item, fd, mFd); PR_Close(fd); if (err != ZIP_OK) @@ -272,15 +279,14 @@ nsJAR::Extract(const char *zipEntry, nsIFile* outFile) else { #if defined(XP_UNIX) - nsCAutoString path; - rv = outFile->GetNativePath(path); - if (NS_SUCCEEDED(rv)) + if (item->flags & ZIFLAG_SYMLINK) { - if (item->flags & ZIFLAG_SYMLINK) + nsCAutoString path; + rv = outFile->GetNativePath(path); + if (NS_SUCCEEDED(rv)) { err = mZip.ResolveSymlink(path.get(),item); } - chmod(path.get(), item->mode); } #endif @@ -431,7 +437,7 @@ nsJAR::OpenFile() if (NS_FAILED(rv)) return nsnull; PRFileDesc* fd; - rv = localFile->OpenNSPRFileDesc(PR_RDONLY, 0664, &fd); + rv = localFile->OpenNSPRFileDesc(PR_RDONLY, 0000, &fd); if (NS_FAILED(rv)) return nsnull; return fd; diff --git a/mozilla/modules/libjar/nsZipArchive.cpp b/mozilla/modules/libjar/nsZipArchive.cpp index 72c8e284f68..34b17b4c0a7 100644 --- a/mozilla/modules/libjar/nsZipArchive.cpp +++ b/mozilla/modules/libjar/nsZipArchive.cpp @@ -90,6 +90,7 @@ char * strdup(const char *src) #endif /* STANDALONE */ #ifdef XP_UNIX + #include #include #include #include @@ -463,7 +464,7 @@ PRInt32 nsZipArchive::OpenArchive(const char * aArchiveName) return ZIP_ERR_PARAM; //-- open the physical file - mFd = PR_Open(aArchiveName, PR_RDONLY, 0); + mFd = PR_Open(aArchiveName, PR_RDONLY, 0000); if (mFd == 0) return ZIP_ERR_DISK; @@ -641,12 +642,26 @@ PRUint32 nsZipReadState::Available() PRInt32 nsZipArchive::ExtractFile(const char* zipEntry, const char* aOutname, PRFileDesc* aFd) { - PRFileDesc* fOut = PR_Open(aOutname, ZFILE_CREATE, 0644); + //-- Find item in archive + nsZipItem* item = GetFileItem(zipEntry); + if (!item) + return ZIP_ERR_FNF; + + // delete any existing file so that we overwrite the file permissions + PR_Delete(aOutname); + + PRFileDesc* fOut = PR_Open(aOutname, ZFILE_CREATE, item->mode); if (fOut == 0) return ZIP_ERR_DISK; - nsZipItem *item = 0; - PRInt32 status = ExtractFileToFileDesc(zipEntry, fOut, &item, aFd); +#if defined(XP_UNIX) && defined(STANDALONE) + // When STANDALONE is defined, PR_Open ignores its 3d argument. + mode_t msk = umask(0); + umask(msk); + chmod(aOutname, item->mode & ~msk); +#endif + + PRInt32 status = ExtractItemToFileDesc(item, fOut, aFd); PR_Close(fOut); if (status != ZIP_OK) @@ -658,30 +673,23 @@ PRInt32 nsZipArchive::ExtractFile(const char* zipEntry, const char* aOutname, { if (ZIFLAG_SYMLINK & item->flags) { - status = ResolveSymlink(aOutname,item); + status = ResolveSymlink(aOutname, item); } - //-- set extracted file permissions - chmod(aOutname, item->mode); } #endif return status; } PRInt32 -nsZipArchive::ExtractFileToFileDesc(const char * zipEntry, PRFileDesc* outFD, - nsZipItem **outItem, PRFileDesc* aFd) +nsZipArchive::ExtractItemToFileDesc(nsZipItem* item, PRFileDesc* outFD, + PRFileDesc* aFd) { //-- sanity check arguments - if (zipEntry == 0 || outFD == 0 || outItem == 0) + if (item == 0 || outFD == 0) return ZIP_ERR_PARAM; PRInt32 status; - //-- Find item in archive - nsZipItem* item = GetFileItem(zipEntry); - if (!item) - return ZIP_ERR_FNF; - //-- extract the file using the appropriate method switch(item->compression) { @@ -698,7 +706,6 @@ nsZipArchive::ExtractFileToFileDesc(const char * zipEntry, PRFileDesc* outFD, return ZIP_ERR_UNSUPPORTED; } - *outItem = item; return status; } @@ -818,7 +825,7 @@ PRInt32 nsZipArchive::ResolveSymlink(const char *path, nsZipItem *item) if (item->flags & ZIFLAG_SYMLINK) { char buf[PATH_MAX+1]; - PRFileDesc * fIn = PR_Open(path, PR_RDONLY, 0644); + PRFileDesc * fIn = PR_Open(path, PR_RDONLY, 0000); if (fIn) { PRInt32 length = PATH_MAX; diff --git a/mozilla/modules/libjar/nsZipArchive.h b/mozilla/modules/libjar/nsZipArchive.h index eeabad027ab..7887a2fc869 100644 --- a/mozilla/modules/libjar/nsZipArchive.h +++ b/mozilla/modules/libjar/nsZipArchive.h @@ -233,8 +233,7 @@ public: PRInt32 ExtractFile(const char * zipEntry, const char * aOutname, PRFileDesc* aFd); - PRInt32 ExtractFileToFileDesc(const char * zipEntry, PRFileDesc* outFD, - nsZipItem **outItem, + PRInt32 ExtractItemToFileDesc(nsZipItem* item, PRFileDesc* outFD, PRFileDesc* aFd); /** diff --git a/mozilla/modules/libjar/zipstub.h b/mozilla/modules/libjar/zipstub.h index b294d61b4f7..4c09a3c3bc3 100644 --- a/mozilla/modules/libjar/zipstub.h +++ b/mozilla/modules/libjar/zipstub.h @@ -42,7 +42,7 @@ #define PL_strcpy strcpy #define PL_strlen strlen -#define PR_Open(a,b,c) fopen((a),(b)) +#define PR_Open(a,b,c) fopen((a),(b)) // XXX Ignores mode #define PR_Read(f,d,n) fread((d),1,(n),(f)) #define PR_Write(f,s,n) fwrite((s),1,(n),(f)) #define PR_Close fclose