Bug 1433982 - Make nsAtomicFileOutputStream::DoOpen() fail if the file is read-only. r=glandium draft
authorNicholas Nethercote <nnethercote@mozilla.com>
Wed, 31 Jan 2018 10:01:26 +1100
changeset 749125 263dd6fb75204a4565c8af89e7b21fc37a10d52e
parent 748241 9b520d529b4a22350c4ef483333f62f68e8b22ca
push id97318
push usernnethercote@mozilla.com
push dateTue, 30 Jan 2018 23:02:03 +0000
reviewersglandium
bugs1433982
milestone60.0a1
Bug 1433982 - Make nsAtomicFileOutputStream::DoOpen() fail if the file is read-only. r=glandium This means we don't leave behind prefs-<n>.js files when prefs.js is read-only. MozReview-Commit-ID: H6KKnoYGdhH
netwerk/base/nsFileStreams.cpp
--- a/netwerk/base/nsFileStreams.cpp
+++ b/netwerk/base/nsFileStreams.cpp
@@ -800,21 +800,28 @@ nsAtomicFileOutputStream::DoOpen()
 
         // XP_UNIX ignores SetFollowLinks(), so we have to normalize.
         if (mTargetFileExists) {
             tempResult->Normalize();
         }
     }
 
     if (NS_SUCCEEDED(rv) && mTargetFileExists) {
+        // Abort if |file| is not writable; it won't work as an output stream.
+        bool isWritable;
+        if (NS_SUCCEEDED(file->IsWritable(&isWritable)) && !isWritable) {
+            return NS_ERROR_FILE_ACCESS_DENIED;
+        }
+
         uint32_t origPerm;
         if (NS_FAILED(file->GetPermissions(&origPerm))) {
             NS_ERROR("Can't get permissions of target file");
             origPerm = mOpenParams.perm;
         }
+
         // XXX What if |perm| is more restrictive then |origPerm|?
         // This leaves the user supplied permissions as they were.
         rv = tempResult->CreateUnique(nsIFile::NORMAL_FILE_TYPE, origPerm);
     }
     if (NS_SUCCEEDED(rv)) {
         // nsFileOutputStream::DoOpen will work on the temporary file, so we
         // prepare it and place it in mOpenParams.localFile.
         mOpenParams.localFile = tempResult;