Browse Source

Bug 2163: Workaround for using /ini=nul on systems when reading "nul" file fails

https://winscp.net/tracker/2163

Source commit: 2a222baa93187e05a2b7c286015bb1ede9146fa1
Martin Prikryl 2 years ago
parent
commit
71ea2a977a

+ 1 - 1
source/core/Configuration.cpp

@@ -192,7 +192,7 @@ THierarchicalStorage * TConfiguration::CreateScpStorage(bool & SessionList)
   }
   else if (Storage == stNul)
   {
-    Result = TIniFileStorage::CreateFromPath(INI_NUL);
+    Result = TIniFileStorage::CreateNul();
   }
   else
   {

+ 9 - 1
source/core/HierarchicalStorage.cpp

@@ -1626,6 +1626,14 @@ TIniFileStorage * __fastcall TIniFileStorage::CreateFromPath(const UnicodeString
   return new TIniFileStorage(AStorage, IniFile);
 }
 //---------------------------------------------------------------------------
+TIniFileStorage * __fastcall TIniFileStorage::CreateNul()
+{
+  // Before we passed "nul", but we have report of a system, where opening "nul" file fails.
+  // Passing an empty string is even more efficient, as it does not even try to read the file.
+  TMemIniFile * IniFile = new TMemIniFile(EmptyStr);
+  return new TIniFileStorage(INI_NUL, IniFile);
+}
+//---------------------------------------------------------------------------
 __fastcall TIniFileStorage::TIniFileStorage(const UnicodeString & AStorage, TCustomIniFile * IniFile):
   TCustomIniFileStorage(AStorage, IniFile)
 {
@@ -1640,7 +1648,7 @@ void __fastcall TIniFileStorage::Flush()
   {
     FMasterStorage->Flush();
   }
-  if (FOriginal != NULL)
+  if ((FOriginal != NULL) && !FIniFile->FileName.IsEmpty())
   {
     std::unique_ptr<TStrings> Strings(new TStringList);
     std::unique_ptr<TStrings> Original(FOriginal);

+ 1 - 0
source/core/HierarchicalStorage.h

@@ -259,6 +259,7 @@ class TIniFileStorage : public TCustomIniFileStorage
 {
 public:
   static TIniFileStorage * __fastcall CreateFromPath(const UnicodeString & AStorage);
+  static TIniFileStorage * __fastcall CreateNul();
   virtual __fastcall ~TIniFileStorage();
 
   virtual void __fastcall Flush();