[tor-commits] [tor-browser/tor-browser-60.1.0esr-8.0-1] Revert "Backport of fix for bug 1412081"

gk at torproject.org gk at torproject.org
Thu Aug 16 09:58:40 UTC 2018


commit bd4abf8ba8f4e1aea2acd4b895274f646ed951a8
Author: Georg Koppen <gk at torproject.org>
Date:   Thu Aug 16 07:21:24 2018 +0000

    Revert "Backport of fix for bug 1412081"
    
    This reverts commit 50f4653b90316394e7d6d3cd4a3e92e12f377666.
    
    We take the patch that actually landed on esr60 instead.
---
 dom/ipc/ContentPrefs.cpp                      |   1 -
 xpcom/io/FilePreferences.cpp                  | 328 ++++++++++----------------
 xpcom/io/FilePreferences.h                    |   6 -
 xpcom/io/nsLocalFileUnix.cpp                  |  58 -----
 xpcom/tests/gtest/TestFilePreferencesUnix.cpp | 203 ----------------
 xpcom/tests/gtest/moz.build                   |   5 -
 6 files changed, 122 insertions(+), 479 deletions(-)

diff --git a/dom/ipc/ContentPrefs.cpp b/dom/ipc/ContentPrefs.cpp
index ac1ea109fc9f..d011c7393125 100644
--- a/dom/ipc/ContentPrefs.cpp
+++ b/dom/ipc/ContentPrefs.cpp
@@ -270,7 +270,6 @@ const char* mozilla::dom::ContentPrefs::gEarlyPrefs[] = {
   "network.dns.disablePrefetch",
   "network.dns.disablePrefetchFromHTTPS",
   "network.file.disable_unc_paths",
-  "network.file.path_blacklist",
   "network.http.tailing.enabled",
   "network.jar.block-remote-files",
   "network.loadinfo.skip_type_assertion",
diff --git a/xpcom/io/FilePreferences.cpp b/xpcom/io/FilePreferences.cpp
index ca133fcaeb40..3ad0e0ee19e0 100644
--- a/xpcom/io/FilePreferences.cpp
+++ b/xpcom/io/FilePreferences.cpp
@@ -6,11 +6,7 @@
 
 #include "FilePreferences.h"
 
-#include "mozilla/ClearOnShutdown.h"
 #include "mozilla/Preferences.h"
-#include "mozilla/StaticPtr.h"
-#include "mozilla/Tokenizer.h"
-#include "mozilla/Unused.h"
 #include "nsAppDirectoryServiceDefs.h"
 #include "nsDirectoryServiceDefs.h"
 #include "nsDirectoryServiceUtils.h"
@@ -19,37 +15,15 @@ namespace mozilla {
 namespace FilePreferences {
 
 static bool sBlockUNCPaths = false;
-typedef nsTArray<nsString> WinPaths;
-static StaticAutoPtr<WinPaths> sWhitelist;
+typedef nsTArray<nsString> Paths;
 
-static WinPaths& PathWhitelist()
+static Paths& PathArray()
 {
-  if (!sWhitelist) {
-    sWhitelist = new nsTArray<nsString>();
-    ClearOnShutdown(&sWhitelist);
-  }
-  return *sWhitelist;
-}
-
-#ifdef XP_WIN
-typedef char16_t char_path_t;
-#else
-typedef char char_path_t;
-#endif
-
-typedef nsTArray<nsTString<char_path_t>> Paths;
-static StaticAutoPtr<Paths> sBlacklist;
-
-static Paths& PathBlacklist()
-{
-  if (!sBlacklist) {
-    sBlacklist = new nsTArray<nsTString<char_path_t>>();
-    ClearOnShutdown(&sBlacklist);
-  }
-  return *sBlacklist;
+  static Paths sPaths;
+  return sPaths;
 }
 
-static void AllowUNCDirectory(char const* directory)
+static void AllowDirectory(char const* directory)
 {
   nsCOMPtr<nsIFile> file;
   NS_GetSpecialDirectory(directory, getter_AddRefs(file));
@@ -69,201 +43,180 @@ static void AllowUNCDirectory(char const* directory)
     return;
   }
 
-  if (!PathWhitelist().Contains(path)) {
-    PathWhitelist().AppendElement(path);
+  if (!PathArray().Contains(path)) {
+    PathArray().AppendElement(path);
   }
 }
 
 void InitPrefs()
 {
   sBlockUNCPaths = Preferences::GetBool("network.file.disable_unc_paths", false);
-
-  PathBlacklist().Clear();
-  nsAutoCString blacklist;
-  Preferences::GetCString("network.file.path_blacklist", blacklist);
-
-  Tokenizer p(blacklist);
-  while (!p.CheckEOF()) {
-    nsCString path;
-    Unused << p.ReadUntil(Tokenizer::Token::Char(','), path);
-    path.Trim(" ");
-    if (!path.IsEmpty()) {
-#ifdef XP_WIN
-      PathBlacklist().AppendElement(NS_ConvertASCIItoUTF16(path));
-#else
-      PathBlacklist().AppendElement(path);
-#endif
-    }
-    Unused << p.CheckChar(',');
-  }
 }
 
 void InitDirectoriesWhitelist()
 {
   // NS_GRE_DIR is the installation path where the binary resides.
-  AllowUNCDirectory(NS_GRE_DIR);
+  AllowDirectory(NS_GRE_DIR);
   // NS_APP_USER_PROFILE_50_DIR and NS_APP_USER_PROFILE_LOCAL_50_DIR are the two
   // parts of the profile we store permanent and local-specific data.
-  AllowUNCDirectory(NS_APP_USER_PROFILE_50_DIR);
-  AllowUNCDirectory(NS_APP_USER_PROFILE_LOCAL_50_DIR);
+  AllowDirectory(NS_APP_USER_PROFILE_50_DIR);
+  AllowDirectory(NS_APP_USER_PROFILE_LOCAL_50_DIR);
 }
 
 namespace { // anon
 
-template <typename TChar>
 class Normalizer
 {
 public:
-  Normalizer(const nsTSubstring<TChar>& aFilePath, const TChar aSeparator)
-    : mFilePathCursor(aFilePath.BeginReading())
-    , mFilePathEnd(aFilePath.EndReading())
-    , mSeparator(aSeparator)
-  {
-  }
+  Normalizer(const nsAString& aFilePath, const char16_t aSeparator);
+  bool Get(nsAString& aNormalizedFilePath);
 
-  bool Get(nsTSubstring<TChar>& aNormalizedFilePath)
-  {
-    aNormalizedFilePath.Truncate();
-
-    // Windows UNC paths begin with double separator (\\)
-    // Linux paths begin with just one separator (/)
-    // If we want to use the normalizer for regular windows paths this code
-    // will need to be updated.
-#ifdef XP_WIN
-    if (IsEOF()) {
-      return true;
-    }
-    if (ConsumeSeparator()) {
-      aNormalizedFilePath.Append(mSeparator);
-    }
-#endif
+private:
+  bool ConsumeItem();
+  bool ConsumeSeparator();
+  bool IsEOF() { return mFilePathCursor == mFilePathEnd; }
 
-    if (IsEOF()) {
-      return true;
-    }
-    if (ConsumeSeparator()) {
-      aNormalizedFilePath.Append(mSeparator);
-    }
+  bool ConsumeName();
+  bool CheckParentDir();
+  bool CheckCurrentDir();
 
-    while (!IsEOF()) {
-      if (!ConsumeName()) {
-        return false;
-      }
-    }
+  nsString::const_char_iterator mFilePathCursor;
+  nsString::const_char_iterator mFilePathEnd;
 
-    for (auto const& name : mStack) {
-      aNormalizedFilePath.Append(name);
-    }
+  nsDependentSubstring mItem;
+  char16_t const mSeparator;
+  nsTArray<nsDependentSubstring> mStack;
+};
 
-    return true;
+Normalizer::Normalizer(const nsAString& aFilePath, const char16_t aSeparator)
+  : mFilePathCursor(aFilePath.BeginReading())
+  , mFilePathEnd(aFilePath.EndReading())
+  , mSeparator(aSeparator)
+{
+}
+
+bool Normalizer::ConsumeItem()
+{
+  if (IsEOF()) {
+    return false;
   }
 
-private:
-  bool ConsumeItem()
-  {
-    if (IsEOF()) {
-      return false;
+  nsString::const_char_iterator nameBegin = mFilePathCursor;
+  while (mFilePathCursor != mFilePathEnd) {
+    if (*mFilePathCursor == mSeparator) {
+      break; // don't include the separator
     }
+    ++mFilePathCursor;
+  }
 
-    typename nsTString<TChar>::const_char_iterator nameBegin = mFilePathCursor;
-    while (mFilePathCursor != mFilePathEnd) {
-      if (*mFilePathCursor == mSeparator) {
-        break; // don't include the separator
-      }
-      ++mFilePathCursor;
-    }
+  mItem.Rebind(nameBegin, mFilePathCursor);
+  return true;
+}
 
-    mItem.Rebind(nameBegin, mFilePathCursor);
-    return true;
+bool Normalizer::ConsumeSeparator()
+{
+  if (IsEOF()) {
+    return false;
   }
 
-  bool ConsumeSeparator()
-  {
-    if (IsEOF()) {
-      return false;
-    }
+  if (*mFilePathCursor != mSeparator) {
+    return false;
+  }
 
-    if (*mFilePathCursor != mSeparator) {
-      return false;
-    }
+  ++mFilePathCursor;
+  return true;
+}
 
-    ++mFilePathCursor;
+bool Normalizer::Get(nsAString& aNormalizedFilePath)
+{
+  aNormalizedFilePath.Truncate();
+
+  if (IsEOF()) {
     return true;
   }
+  if (ConsumeSeparator()) {
+    aNormalizedFilePath.Append(mSeparator);
+  }
 
-  bool IsEOF() { return mFilePathCursor == mFilePathEnd; }
+  if (IsEOF()) {
+    return true;
+  }
+  if (ConsumeSeparator()) {
+    aNormalizedFilePath.Append(mSeparator);
+  }
 
-  bool ConsumeName()
-  {
-    if (!ConsumeItem()) {
-      return true;
+  while (!IsEOF()) {
+    if (!ConsumeName()) {
+      return false;
     }
+  }
 
-    if (CheckCurrentDir()) {
-      return true;
-    }
+  for (auto const& name : mStack) {
+    aNormalizedFilePath.Append(name);
+  }
 
-    if (CheckParentDir()) {
-      if (!mStack.Length()) {
-        // This means there are more \.. than valid names
-        return false;
-      }
+  return true;
+}
 
-      mStack.RemoveElementAt(mStack.Length() - 1);
-      return true;
-    }
+bool Normalizer::ConsumeName()
+{
+  if (!ConsumeItem()) {
+    return true;
+  }
 
-    if (mItem.IsEmpty()) {
-      // this means an empty name (a lone slash), which is illegal
-      return false;
-    }
+  if (CheckCurrentDir()) {
+    return true;
+  }
 
-    if (ConsumeSeparator()) {
-      mItem.Rebind(mItem.BeginReading(), mFilePathCursor);
+  if (CheckParentDir()) {
+    if (!mStack.Length()) {
+      // This means there are more \.. than valid names
+      return false;
     }
-    mStack.AppendElement(mItem);
 
+    mStack.RemoveElementAt(mStack.Length() - 1);
     return true;
   }
 
-  bool CheckParentDir()
-  {
-    if (mItem.EqualsLiteral("..")) {
-      ConsumeSeparator();
-      // EOF is acceptable
-      return true;
-    }
-
+  if (mItem.IsEmpty()) {
+    // this means an empty name (a lone slash), which is illegal
     return false;
   }
 
-  bool CheckCurrentDir()
-  {
-    if (mItem.EqualsLiteral(".")) {
-      ConsumeSeparator();
-      // EOF is acceptable
-      return true;
-    }
+  if (ConsumeSeparator()) {
+    mItem.Rebind(mItem.BeginReading(), mFilePathCursor);
+  }
+  mStack.AppendElement(mItem);
 
-    return false;
+  return true;
+}
+
+bool Normalizer::CheckCurrentDir()
+{
+  if (mItem == NS_LITERAL_STRING(".")) {
+    ConsumeSeparator();
+    // EOF is acceptable
+    return true;
   }
 
-  typename nsTString<TChar>::const_char_iterator mFilePathCursor;
-  typename nsTString<TChar>::const_char_iterator mFilePathEnd;
+  return false;
+}
 
-  nsTDependentSubstring<TChar> mItem;
-  TChar const mSeparator;
-  nsTArray<nsTDependentSubstring<TChar>> mStack;
-};
+bool Normalizer::CheckParentDir()
+{
+  if (mItem == NS_LITERAL_STRING("..")) {
+    ConsumeSeparator();
+    // EOF is acceptable
+    return true;
+  }
+
+  return false;
+}
 
 } // anon
 
 bool IsBlockedUNCPath(const nsAString& aFilePath)
 {
-  if (!sWhitelist) {
-    return false;
-  }
-
   if (!sBlockUNCPaths) {
     return false;
   }
@@ -273,12 +226,12 @@ bool IsBlockedUNCPath(const nsAString& aFilePath)
   }
 
   nsAutoString normalized;
-  if (!Normalizer<char16_t>(aFilePath, L'\\').Get(normalized)) {
+  if (!Normalizer(aFilePath, L'\\').Get(normalized)) {
     // Broken paths are considered invalid and thus inaccessible
     return true;
   }
 
-  for (const auto& allowedPrefix : PathWhitelist()) {
+  for (const auto& allowedPrefix : PathArray()) {
     if (StringBeginsWith(normalized, allowedPrefix)) {
       if (normalized.Length() == allowedPrefix.Length()) {
         return false;
@@ -298,43 +251,6 @@ bool IsBlockedUNCPath(const nsAString& aFilePath)
   return true;
 }
 
-#ifdef XP_WIN
-const char16_t kPathSeparator = L'\\';
-#else
-const char kPathSeparator = '/';
-#endif
-
-bool IsAllowedPath(const nsTSubstring<char_path_t>& aFilePath)
-{
-  // If sBlacklist has been cleared at shutdown, we must avoid calling
-  // PathBlacklist() again, as that will recreate the array and we will leak.
-  if (!sBlacklist) {
-    return true;
-  }
-
-  if (PathBlacklist().Length() == 0) {
-    return true;
-  }
-
-  nsTAutoString<char_path_t> normalized;
-  if (!Normalizer<char_path_t>(aFilePath, kPathSeparator).Get(normalized)) {
-    // Broken paths are considered invalid and thus inaccessible
-    return false;
-  }
-
-  for (const auto& prefix : PathBlacklist()) {
-    if (StringBeginsWith(normalized, prefix)) {
-      if (normalized.Length() > prefix.Length() &&
-          normalized[prefix.Length()] != kPathSeparator) {
-        continue;
-      }
-      return false;
-    }
-  }
-
-  return true;
-}
-
 void testing::SetBlockUNCPaths(bool aBlock)
 {
   sBlockUNCPaths = aBlock;
@@ -342,12 +258,12 @@ void testing::SetBlockUNCPaths(bool aBlock)
 
 void testing::AddDirectoryToWhitelist(nsAString const & aPath)
 {
-  PathWhitelist().AppendElement(aPath);
+  PathArray().AppendElement(aPath);
 }
 
 bool testing::NormalizePath(nsAString const & aPath, nsAString & aNormalized)
 {
-  Normalizer<char16_t> normalizer(aPath, L'\\');
+  Normalizer normalizer(aPath, L'\\');
   return normalizer.Get(aNormalized);
 }
 
diff --git a/xpcom/io/FilePreferences.h b/xpcom/io/FilePreferences.h
index 71c244201735..fa281f9e6799 100644
--- a/xpcom/io/FilePreferences.h
+++ b/xpcom/io/FilePreferences.h
@@ -13,12 +13,6 @@ void InitPrefs();
 void InitDirectoriesWhitelist();
 bool IsBlockedUNCPath(const nsAString& aFilePath);
 
-#ifdef XP_WIN
-bool IsAllowedPath(const nsAString& aFilePath);
-#else
-bool IsAllowedPath(const nsACString& aFilePath);
-#endif
-
 namespace testing {
 
 void SetBlockUNCPaths(bool aBlock);
diff --git a/xpcom/io/nsLocalFileUnix.cpp b/xpcom/io/nsLocalFileUnix.cpp
index cc241b179ab4..768f66b301ec 100644
--- a/xpcom/io/nsLocalFileUnix.cpp
+++ b/xpcom/io/nsLocalFileUnix.cpp
@@ -12,7 +12,6 @@
 #include "mozilla/Attributes.h"
 #include "mozilla/DebugOnly.h"
 #include "mozilla/Sprintf.h"
-#include "mozilla/FilePreferences.h"
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -85,8 +84,6 @@ using namespace mozilla;
     do {                                        \
         if (mPath.IsEmpty())                    \
             return NS_ERROR_NOT_INITIALIZED;    \
-        if (!FilePreferences::IsAllowedPath(mPath)) \
-            return NS_ERROR_FILE_ACCESS_DENIED; \
     } while(0)
 
 /* directory enumerator */
@@ -143,13 +140,6 @@ nsDirEnumeratorUnix::Init(nsLocalFile* aParent,
     return NS_ERROR_FILE_INVALID_PATH;
   }
 
-  // When enumerating the directory, the paths must have a slash at the end.
-  nsAutoCString dirPathWithSlash(dirPath);
-  dirPathWithSlash.Append('/');
-  if (!FilePreferences::IsAllowedPath(dirPathWithSlash)) {
-    return NS_ERROR_FILE_ACCESS_DENIED;
-  }
-
   if (NS_FAILED(aParent->GetNativePath(mParentPath))) {
     return NS_ERROR_FAILURE;
   }
@@ -279,11 +269,6 @@ nsLocalFile::nsLocalFileConstructor(nsISupports* aOuter,
 bool
 nsLocalFile::FillStatCache()
 {
-  if (!FilePreferences::IsAllowedPath(mPath)) {
-    errno = EACCES;
-    return false;
-  }
-
   if (STAT(mPath.get(), &mCachedStat) == -1) {
     // try lstat it may be a symlink
     if (LSTAT(mPath.get(), &mCachedStat) == -1) {
@@ -326,11 +311,6 @@ nsLocalFile::InitWithNativePath(const nsACString& aFilePath)
     mPath = aFilePath;
   }
 
-  if (!FilePreferences::IsAllowedPath(mPath)) {
-    mPath.Truncate();
-    return NS_ERROR_FILE_ACCESS_DENIED;
-  }
-
   // trim off trailing slashes
   ssize_t len = mPath.Length();
   while ((len > 1) && (mPath[len - 1] == '/')) {
@@ -344,10 +324,6 @@ nsLocalFile::InitWithNativePath(const nsACString& aFilePath)
 NS_IMETHODIMP
 nsLocalFile::CreateAllAncestors(uint32_t aPermissions)
 {
-  if (!FilePreferences::IsAllowedPath(mPath)) {
-    return NS_ERROR_FILE_ACCESS_DENIED;
-  }
-
   // <jband> I promise to play nice
   char* buffer = mPath.BeginWriting();
   char* slashp = buffer;
@@ -419,9 +395,6 @@ NS_IMETHODIMP
 nsLocalFile::OpenNSPRFileDesc(int32_t aFlags, int32_t aMode,
                               PRFileDesc** aResult)
 {
-  if (!FilePreferences::IsAllowedPath(mPath)) {
-    return NS_ERROR_FILE_ACCESS_DENIED;
-  }
   *aResult = PR_Open(mPath.get(), aFlags, aMode);
   if (!*aResult) {
     return NS_ErrorAccordingToNSPR();
@@ -443,9 +416,6 @@ nsLocalFile::OpenNSPRFileDesc(int32_t aFlags, int32_t aMode,
 NS_IMETHODIMP
 nsLocalFile::OpenANSIFileDesc(const char* aMode, FILE** aResult)
 {
-  if (!FilePreferences::IsAllowedPath(mPath)) {
-    return NS_ERROR_FILE_ACCESS_DENIED;
-  }
   *aResult = fopen(mPath.get(), aMode);
   if (!*aResult) {
     return NS_ERROR_FAILURE;
@@ -472,10 +442,6 @@ nsresult
 nsLocalFile::CreateAndKeepOpen(uint32_t aType, int aFlags,
                                uint32_t aPermissions, PRFileDesc** aResult)
 {
-  if (!FilePreferences::IsAllowedPath(mPath)) {
-    return NS_ERROR_FILE_ACCESS_DENIED;
-  }
-
   if (aType != NORMAL_FILE_TYPE && aType != DIRECTORY_TYPE) {
     return NS_ERROR_FILE_UNKNOWN_TYPE;
   }
@@ -525,10 +491,6 @@ nsLocalFile::CreateAndKeepOpen(uint32_t aType, int aFlags,
 NS_IMETHODIMP
 nsLocalFile::Create(uint32_t aType, uint32_t aPermissions)
 {
-  if (!FilePreferences::IsAllowedPath(mPath)) {
-    return NS_ERROR_FILE_ACCESS_DENIED;
-  }
-
   PRFileDesc* junk = nullptr;
   nsresult rv = CreateAndKeepOpen(aType,
                                   PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE |
@@ -584,10 +546,6 @@ nsLocalFile::Normalize()
   char resolved_path[PATH_MAX] = "";
   char* resolved_path_ptr = nullptr;
 
-  if (!FilePreferences::IsAllowedPath(mPath)) {
-    return NS_ERROR_FILE_ACCESS_DENIED;
-  }
-
   resolved_path_ptr = realpath(mPath.get(), resolved_path);
 
   // if there is an error, the return is null.
@@ -1059,10 +1017,6 @@ nsLocalFile::MoveToNative(nsIFile* aNewParent, const nsACString& aNewName)
     return rv;
   }
 
-  if (!FilePreferences::IsAllowedPath(newPathName)) {
-    return NS_ERROR_FILE_ACCESS_DENIED;
-  }
-
   // try for atomic rename, falling back to copy/delete
   if (rename(mPath.get(), newPathName.get()) < 0) {
     if (errno == EXDEV) {
@@ -2005,10 +1959,6 @@ nsLocalFile::SetPersistentDescriptor(const nsACString& aPersistentDescriptor)
 NS_IMETHODIMP
 nsLocalFile::Reveal()
 {
-  if (!FilePreferences::IsAllowedPath(mPath)) {
-    return NS_ERROR_FILE_ACCESS_DENIED;
-  }
-
 #ifdef MOZ_WIDGET_GTK
   nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
   if (!giovfs) {
@@ -2052,10 +2002,6 @@ nsLocalFile::Reveal()
 NS_IMETHODIMP
 nsLocalFile::Launch()
 {
-  if (!FilePreferences::IsAllowedPath(mPath)) {
-    return NS_ERROR_FILE_ACCESS_DENIED;
-  }
-
 #ifdef MOZ_WIDGET_GTK
   nsCOMPtr<nsIGIOService> giovfs = do_GetService(NS_GIOSERVICE_CONTRACTID);
   if (!giovfs) {
@@ -2210,10 +2156,6 @@ nsLocalFile::RenameToNative(nsIFile* aNewParentDir, const nsACString& aNewName)
     return rv;
   }
 
-  if (!FilePreferences::IsAllowedPath(newPathName)) {
-    return NS_ERROR_FILE_ACCESS_DENIED;
-  }
-
   // try for atomic rename
   if (rename(mPath.get(), newPathName.get()) < 0) {
     if (errno == EXDEV) {
diff --git a/xpcom/tests/gtest/TestFilePreferencesUnix.cpp b/xpcom/tests/gtest/TestFilePreferencesUnix.cpp
deleted file mode 100644
index c19928fcaec4..000000000000
--- a/xpcom/tests/gtest/TestFilePreferencesUnix.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-#include "gtest/gtest.h"
-
-#include "mozilla/FilePreferences.h"
-
-#include "nsDirectoryServiceDefs.h"
-#include "nsDirectoryServiceUtils.h"
-#include "mozilla/Preferences.h"
-#include "mozilla/ScopeExit.h"
-#include "nsISimpleEnumerator.h"
-
-using namespace mozilla;
-
-TEST(TestFilePreferencesUnix, Parsing)
-{
-  #define kBlacklisted "/tmp/blacklisted"
-  #define kBlacklistedDir "/tmp/blacklisted/"
-  #define kBlacklistedFile "/tmp/blacklisted/file"
-  #define kOther "/tmp/other"
-  #define kOtherDir "/tmp/other/"
-  #define kOtherFile "/tmp/other/file"
-  #define kAllowed "/tmp/allowed"
-
-  // This is run on exit of this function to make sure we clear the pref
-  // and that behaviour with the pref cleared is correct.
-  auto cleanup = MakeScopeExit([&] {
-    nsresult rv = Preferences::ClearUser("network.file.path_blacklist");
-    ASSERT_EQ(rv, NS_OK);
-    FilePreferences::InitPrefs();
-    ASSERT_EQ(FilePreferences::IsAllowedPath(NS_LITERAL_CSTRING(kBlacklisted)), true);
-    ASSERT_EQ(FilePreferences::IsAllowedPath(NS_LITERAL_CSTRING(kBlacklistedDir)), true);
-    ASSERT_EQ(FilePreferences::IsAllowedPath(NS_LITERAL_CSTRING(kBlacklistedFile)), true);
-    ASSERT_EQ(FilePreferences::IsAllowedPath(NS_LITERAL_CSTRING(kAllowed)), true);
-  });
-
-  auto CheckPrefs = [](const nsACString& aPaths)
-  {
-    nsresult rv;
-    rv = Preferences::SetCString("network.file.path_blacklist", aPaths);
-    ASSERT_EQ(rv, NS_OK);
-    FilePreferences::InitPrefs();
-    ASSERT_EQ(FilePreferences::IsAllowedPath(NS_LITERAL_CSTRING(kBlacklistedDir)), false);
-    ASSERT_EQ(FilePreferences::IsAllowedPath(NS_LITERAL_CSTRING(kBlacklistedDir)), false);
-    ASSERT_EQ(FilePreferences::IsAllowedPath(NS_LITERAL_CSTRING(kBlacklistedFile)), false);
-    ASSERT_EQ(FilePreferences::IsAllowedPath(NS_LITERAL_CSTRING(kBlacklisted)), false);
-    ASSERT_EQ(FilePreferences::IsAllowedPath(NS_LITERAL_CSTRING(kAllowed)), true);
-  };
-
-  CheckPrefs(NS_LITERAL_CSTRING(kBlacklisted));
-  CheckPrefs(NS_LITERAL_CSTRING(kBlacklisted "," kOther));
-  ASSERT_EQ(FilePreferences::IsAllowedPath(NS_LITERAL_CSTRING(kOtherFile)), false);
-  CheckPrefs(NS_LITERAL_CSTRING(kBlacklisted "," kOther ","));
-  ASSERT_EQ(FilePreferences::IsAllowedPath(NS_LITERAL_CSTRING(kOtherFile)), false);
-}
-
-TEST(TestFilePreferencesUnix, Simple)
-{
-  nsAutoCString tempPath;
-
-  // This is the directory we will blacklist
-  nsCOMPtr<nsIFile> blacklistedDir;
-  nsresult rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(blacklistedDir));
-  ASSERT_EQ(rv, NS_OK);
-  rv = blacklistedDir->GetNativePath(tempPath);
-  ASSERT_EQ(rv, NS_OK);
-  rv = blacklistedDir->AppendNative(NS_LITERAL_CSTRING("blacklisted_dir"));
-  ASSERT_EQ(rv, NS_OK);
-
-  // This is executed at exit to clean up after ourselves.
-  auto cleanup = MakeScopeExit([&] {
-    nsresult rv = Preferences::ClearUser("network.file.path_blacklist");
-    ASSERT_EQ(rv, NS_OK);
-    FilePreferences::InitPrefs();
-
-    rv = blacklistedDir->Remove(true);
-    ASSERT_EQ(rv, NS_OK);
-  });
-
-  // Create the directory
-  rv = blacklistedDir->Create(nsIFile::DIRECTORY_TYPE, 0666);
-  ASSERT_EQ(rv, NS_OK);
-
-  // This is the file we will try to access
-  nsCOMPtr<nsIFile> blacklistedFile;
-  rv = blacklistedDir->Clone(getter_AddRefs(blacklistedFile));
-  ASSERT_EQ(rv, NS_OK);
-  rv = blacklistedFile->AppendNative(NS_LITERAL_CSTRING("test_file"));
-
-  // Create the file
-  ASSERT_EQ(rv, NS_OK);
-  rv = blacklistedFile->Create(nsIFile::NORMAL_FILE_TYPE, 0666);
-
-  // Get the path for the blacklist
-  nsAutoCString blackListPath;
-  rv = blacklistedDir->GetNativePath(blackListPath);
-  ASSERT_EQ(rv, NS_OK);
-
-  // Set the pref and make sure it is enforced
-  rv = Preferences::SetCString("network.file.path_blacklist", blackListPath);
-  ASSERT_EQ(rv, NS_OK);
-  FilePreferences::InitPrefs();
-
-  // Check that we can't access some of the file attributes
-  int64_t size;
-  rv = blacklistedFile->GetFileSize(&size);
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  bool exists;
-  rv = blacklistedFile->Exists(&exists);
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  // Check that we can't enumerate the directory
-  nsCOMPtr<nsISimpleEnumerator> dirEnumerator;
-  rv = blacklistedDir->GetDirectoryEntries(getter_AddRefs(dirEnumerator));
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  nsCOMPtr<nsIFile> newPath;
-  rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(newPath));
-  ASSERT_EQ(rv, NS_OK);
-  rv = newPath->AppendNative(NS_LITERAL_CSTRING("."));
-  ASSERT_EQ(rv, NS_OK);
-  rv = newPath->AppendNative(NS_LITERAL_CSTRING("blacklisted_dir"));
-  ASSERT_EQ(rv, NS_OK);
-  rv = newPath->Exists(&exists);
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  rv = newPath->AppendNative(NS_LITERAL_CSTRING("test_file"));
-  ASSERT_EQ(rv, NS_OK);
-  rv = newPath->Exists(&exists);
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  // Check that ./ does not bypass the filter
-  rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(newPath));
-  ASSERT_EQ(rv, NS_OK);
-  rv = newPath->AppendRelativeNativePath(NS_LITERAL_CSTRING("./blacklisted_dir/file"));
-  ASSERT_EQ(rv, NS_OK);
-  rv = newPath->Exists(&exists);
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  // Check that ..  does not bypass the filter
-  rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(newPath));
-  ASSERT_EQ(rv, NS_OK);
-  rv = newPath->AppendRelativeNativePath(NS_LITERAL_CSTRING("allowed/../blacklisted_dir/file"));
-  ASSERT_EQ(rv, NS_OK);
-  rv = newPath->Exists(&exists);
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(newPath));
-  ASSERT_EQ(rv, NS_OK);
-  rv = newPath->AppendNative(NS_LITERAL_CSTRING("allowed"));
-  ASSERT_EQ(rv, NS_OK);
-  rv = newPath->AppendNative(NS_LITERAL_CSTRING(".."));
-  ASSERT_EQ(rv, NS_OK);
-  rv = newPath->AppendNative(NS_LITERAL_CSTRING("blacklisted_dir"));
-  ASSERT_EQ(rv, NS_OK);
-  rv = newPath->Exists(&exists);
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  nsAutoCString trickyPath(tempPath);
-  trickyPath.AppendLiteral("/allowed/../blacklisted_dir/file");
-  rv = newPath->InitWithNativePath(trickyPath);
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  // Check that we can't construct a path that is functionally the same
-  // as the blacklisted one and bypasses the filter.
-  trickyPath = tempPath;
-  trickyPath.AppendLiteral("/./blacklisted_dir/file");
-  rv = newPath->InitWithNativePath(trickyPath);
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  trickyPath = tempPath;
-  trickyPath.AppendLiteral("//blacklisted_dir/file");
-  rv = newPath->InitWithNativePath(trickyPath);
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  trickyPath.Truncate();
-  trickyPath.AppendLiteral("//");
-  trickyPath.Append(tempPath);
-  trickyPath.AppendLiteral("/blacklisted_dir/file");
-  rv = newPath->InitWithNativePath(trickyPath);
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  trickyPath.Truncate();
-  trickyPath.AppendLiteral("//");
-  trickyPath.Append(tempPath);
-  trickyPath.AppendLiteral("//blacklisted_dir/file");
-  rv = newPath->InitWithNativePath(trickyPath);
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-
-  // Check that if the blacklisted string is a directory, we only block access
-  // to subresources, not the directory itself.
-  nsAutoCString blacklistDirPath(blackListPath);
-  blacklistDirPath.Append("/");
-  rv = Preferences::SetCString("network.file.path_blacklist", blacklistDirPath);
-  ASSERT_EQ(rv, NS_OK);
-  FilePreferences::InitPrefs();
-
-  // This should work, since we only block subresources
-  rv = blacklistedDir->Exists(&exists);
-  ASSERT_EQ(rv, NS_OK);
-
-  rv = blacklistedDir->GetDirectoryEntries(getter_AddRefs(dirEnumerator));
-  ASSERT_EQ(rv, NS_ERROR_FILE_ACCESS_DENIED);
-}
diff --git a/xpcom/tests/gtest/moz.build b/xpcom/tests/gtest/moz.build
index 4f1c9c73d653..90b5fd7652e6 100644
--- a/xpcom/tests/gtest/moz.build
+++ b/xpcom/tests/gtest/moz.build
@@ -73,11 +73,6 @@ if CONFIG['OS_TARGET'] == 'WINNT':
     UNIFIED_SOURCES += [
         'TestFilePreferencesWin.cpp',
     ]
-else:
-    UNIFIED_SOURCES += [
-        'TestFilePreferencesUnix.cpp',
-    ]
-
 
 if CONFIG['WRAP_STL_INCLUDES'] and CONFIG['CC_TYPE'] != 'clang-cl':
     UNIFIED_SOURCES += [





More information about the tor-commits mailing list