richard pushed to branch base-browser-115.5.0esr-13.5-1 at The Tor Project / Applications / Tor Browser

Commits:

1 changed file:

Changes:

  • toolkit/xre/LauncherRegistryInfo.cpp
    ... ... @@ -17,6 +17,9 @@
    17 17
     #include <string>
    
    18 18
     #include <type_traits>
    
    19 19
     
    
    20
    +// tor-browser#42163
    
    21
    +#include <filesystem>
    
    22
    +
    
    20 23
     #define EXPAND_STRING_MACRO2(t) t
    
    21 24
     #define EXPAND_STRING_MACRO(t) EXPAND_STRING_MACRO2(t)
    
    22 25
     
    
    ... ... @@ -586,6 +589,45 @@ LauncherRegistryInfo::GetBrowserStartTimestamp() {
    586 589
     
    
    587 590
     LauncherResult<std::wstring>
    
    588 591
     LauncherRegistryInfo::BuildDefaultBlocklistFilename() {
    
    592
    +  // tor-browser#42163: Make the DLL blocklist obey portable mode
    
    593
    +  {
    
    594
    +    std::filesystem::path appDir;
    
    595
    +    {
    
    596
    +      mozilla::UniquePtr<wchar_t[]> appDirStr = GetFullBinaryPath();
    
    597
    +      if (!appDirStr) {
    
    598
    +        return LAUNCHER_ERROR_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
    
    599
    +      }
    
    600
    +      appDir = std::filesystem::path(appDirStr.get()).parent_path();
    
    601
    +    }
    
    602
    +    std::error_code ec;
    
    603
    +    const bool isPortable =
    
    604
    +        !std::filesystem::exists(appDir / L"system-install", ec);
    
    605
    +    if (ec) {
    
    606
    +      // exists is supposed not to set an error when a file does not exist
    
    607
    +      // (whereas other functions such as is_regular_file sets it).
    
    608
    +      // The standard is quite opaque about the meaning of the numeric codes.
    
    609
    +      // Moreover, we use libcxx on Windows, and it seems they created a sort of
    
    610
    +      // POSIX compatibility layer (e.g., for stat), see
    
    611
    +      // libcxx/src/filesystem/posix_compat.h.
    
    612
    +      // std::error_code has a message function, but all the various macro are
    
    613
    +      // specific to handle Windows errors, so we have to use the generic error.
    
    614
    +      // At least, at the moment the error is dropped eventually.
    
    615
    +      return LAUNCHER_ERROR_GENERIC();
    
    616
    +    }
    
    617
    +    if (isPortable) {
    
    618
    +      // RELATIVE_DATA_DIR must have forward slashes, but weakly_canonical
    
    619
    +      // already changes them to backslashes.
    
    620
    +      const std::filesystem::path blocklistPath =
    
    621
    +          std::filesystem::weakly_canonical(
    
    622
    +              appDir / L"" RELATIVE_DATA_DIR / L"blocklist", ec);
    
    623
    +      if (ec) {
    
    624
    +        return LAUNCHER_ERROR_GENERIC();
    
    625
    +      }
    
    626
    +      return blocklistPath.wstring();
    
    627
    +    }
    
    628
    +    // Normal installation, continue on Mozilla's path
    
    629
    +  }
    
    630
    +
    
    589 631
       // These flags are chosen to avoid I/O, see bug 1363398.
    
    590 632
       const DWORD flags =
    
    591 633
           KF_FLAG_SIMPLE_IDLIST | KF_FLAG_DONT_VERIFY | KF_FLAG_NO_ALIAS;
    
    ... ... @@ -618,6 +660,8 @@ LauncherRegistryInfo::BuildDefaultBlocklistFilename() {
    618 660
     }
    
    619 661
     
    
    620 662
     LauncherResult<std::wstring> LauncherRegistryInfo::GetBlocklistFileName() {
    
    663
    +  // tor-browser#42163: Make the DLL blocklist obey portable mode
    
    664
    +#ifndef BASE_BROWSER_VERSION
    
    621 665
       LauncherResult<Disposition> disposition = Open();
    
    622 666
       if (disposition.isErr()) {
    
    623 667
         return disposition.propagateErr();
    
    ... ... @@ -633,19 +677,19 @@ LauncherResult<std::wstring> LauncherRegistryInfo::GetBlocklistFileName() {
    633 677
         UniquePtr<wchar_t[]> buf = readResult.unwrap();
    
    634 678
         return std::wstring(buf.get());
    
    635 679
       }
    
    636
    -
    
    680
    +#endif
    
    637 681
       LauncherResult<std::wstring> defaultBlocklistPath =
    
    638 682
           BuildDefaultBlocklistFilename();
    
    639 683
       if (defaultBlocklistPath.isErr()) {
    
    640 684
         return defaultBlocklistPath.propagateErr();
    
    641 685
       }
    
    642
    -
    
    686
    +#ifndef BASE_BROWSER_VERSION
    
    643 687
       LauncherVoidResult writeResult = WriteRegistryValueString(
    
    644 688
           mRegKey, ResolveBlocklistValueName(), defaultBlocklistPath.inspect());
    
    645 689
       if (writeResult.isErr()) {
    
    646 690
         return writeResult.propagateErr();
    
    647 691
       }
    
    648
    -
    
    692
    +#endif
    
    649 693
       return defaultBlocklistPath;
    
    650 694
     }
    
    651 695