From 0d39bf7749d82c76ca855ec19537f7c760425ff4 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Fri, 13 Mar 2020 00:46:41 +0100 Subject: [PATCH] + fix: NP3 installed version: no write access locking on programs dir (.ini redirection) --- Versions/build.txt | 2 +- Versions/day.txt | 2 +- minipath/src/Config.cpp | 41 ++++++++++++++++++++++---------- res/Notepad3.exe.manifest.conf | 2 +- src/Config/Config.cpp | 43 +++++++++++++++++++++++----------- src/VersionEx.h | 4 ++-- 6 files changed, 62 insertions(+), 32 deletions(-) diff --git a/Versions/build.txt b/Versions/build.txt index 1e8b31496..d00491fd7 100644 --- a/Versions/build.txt +++ b/Versions/build.txt @@ -1 +1 @@ -6 +1 diff --git a/Versions/day.txt b/Versions/day.txt index a1e0432c9..5478c714f 100644 --- a/Versions/day.txt +++ b/Versions/day.txt @@ -1 +1 @@ -312 +313 diff --git a/minipath/src/Config.cpp b/minipath/src/Config.cpp index f193bf423..9008841e2 100644 --- a/minipath/src/Config.cpp +++ b/minipath/src/Config.cpp @@ -75,7 +75,7 @@ constexpr bool SI_Success(const SI_Error rc) noexcept { // of complete file to preserve integrety of any transaction // ---------------------------------------------------------------------------- -HANDLE AcquireFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) +HANDLE AcquireWriteFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) { HANDLE hFile = CreateFile(lpIniFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, @@ -89,6 +89,20 @@ HANDLE AcquireFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) // ---------------------------------------------------------------------------- +HANDLE AcquireReadFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) +{ + HANDLE hFile = CreateFile(lpIniFilePath, + GENERIC_READ, FILE_SHARE_READ, + nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + + DWORD const flags = LOCKFILE_EXCLUSIVE_LOCK; + bool const bLocked = LockFileEx(hFile, flags, 0, MAXDWORD, 0, &rOvrLpd); + + return (bLocked ? hFile : INVALID_HANDLE_VALUE); +} + +// ---------------------------------------------------------------------------- + bool ReleaseFileLock(HANDLE hFile, OVERLAPPED& rOvrLpd) { bool bUnLocked = true; @@ -116,7 +130,7 @@ extern "C" BOOL LoadIniFile(LPCWSTR lpIniFilePath) s_INI.SetSpaces(s_bSetSpaces); s_INI.SetMultiLine(s_bUseMultiLine); - s_INI_Hndl = AcquireFileLock(lpIniFilePath, s_OvrLpd); + s_INI_Hndl = AcquireReadFileLock(lpIniFilePath, s_OvrLpd); if (s_INI_Hndl == INVALID_HANDLE_VALUE) { return false; } @@ -316,7 +330,7 @@ extern "C" size_t IniFileGetString(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LP CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { StringCchCopyW(lpReturnedString, cchReturnedString, lpDefault); return (size_t)lstrlen(lpReturnedString); @@ -344,7 +358,7 @@ extern "C" BOOL IniFileSetString(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCW Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -370,7 +384,7 @@ extern "C" int IniFileGetInt(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return iDefault; } @@ -396,7 +410,7 @@ extern "C" BOOL IniFileSetInt(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -419,7 +433,7 @@ extern "C" BOOL IniFileGetBool(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWST CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return bDefault; } @@ -445,7 +459,7 @@ extern "C" BOOL IniFileSetBool(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWST Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -469,7 +483,7 @@ extern "C" BOOL IniFileDelete(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -492,7 +506,7 @@ extern "C" BOOL IniFileIterateSection(LPCWSTR lpFilePath, LPCWSTR lpSectionName, CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -585,14 +599,15 @@ int CreateIniFile() } } else { - OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(g_wchIniFile, ovrLpd); + HANDLE hFile = CreateFile(g_wchIniFile, + GENERIC_READ, FILE_SHARE_READ, + nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); if (hFile == INVALID_HANDLE_VALUE) { return result; } DWORD dwFSHigh = 0UL; dwFileSize = GetFileSize(hFile, &dwFSHigh); - ReleaseFileLock(hFile, ovrLpd); + CloseHandle(hFile); } if ((dwFileSize == 0) && (dwFileSize != INVALID_FILE_SIZE)) { diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf index 40d30beb7..8dd115450 100644 --- a/res/Notepad3.exe.manifest.conf +++ b/res/Notepad3.exe.manifest.conf @@ -3,7 +3,7 @@ Notepad3 RC3 diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp index 7b64ae485..3672a2c68 100644 --- a/src/Config/Config.cpp +++ b/src/Config/Config.cpp @@ -89,7 +89,7 @@ constexpr bool SI_Success(const SI_Error rc) noexcept { // of complete file to preserve integrety of any transaction // ---------------------------------------------------------------------------- -HANDLE AcquireFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) +HANDLE AcquireWriteFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) { HANDLE hFile = CreateFile(lpIniFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, @@ -103,6 +103,20 @@ HANDLE AcquireFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) // ---------------------------------------------------------------------------- +HANDLE AcquireReadFileLock(LPCWSTR lpIniFilePath, OVERLAPPED& rOvrLpd) +{ + HANDLE hFile = CreateFile(lpIniFilePath, + GENERIC_READ, FILE_SHARE_READ, + nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + + DWORD const flags = LOCKFILE_EXCLUSIVE_LOCK; + bool const bLocked = LockFileEx(hFile, flags, 0, MAXDWORD, 0, &rOvrLpd); + + return (bLocked ? hFile : INVALID_HANDLE_VALUE); +} + +// ---------------------------------------------------------------------------- + bool ReleaseFileLock(HANDLE hFile, OVERLAPPED& rOvrLpd) { bool bUnLocked = true; @@ -130,7 +144,7 @@ extern "C" bool LoadIniFile(LPCWSTR lpIniFilePath) s_INI.SetSpaces(s_bSetSpaces); s_INI.SetMultiLine(s_bUseMultiLine); - s_INI_Hndl = AcquireFileLock(lpIniFilePath, s_OvrLpd); + s_INI_Hndl = AcquireReadFileLock(lpIniFilePath, s_OvrLpd); if (s_INI_Hndl == INVALID_HANDLE_VALUE) { return false; } @@ -330,7 +344,7 @@ extern "C" size_t IniFileGetString(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LP CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { StringCchCopyW(lpReturnedString, cchReturnedString, lpDefault); return StringCchLenW(lpReturnedString, cchReturnedString); @@ -358,7 +372,7 @@ extern "C" bool IniFileSetString(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCW Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -384,7 +398,7 @@ extern "C" int IniFileGetInt(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return iDefault; } @@ -410,7 +424,7 @@ extern "C" bool IniFileSetInt(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -433,7 +447,7 @@ extern "C" bool IniFileGetBool(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWST CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return bDefault; } @@ -459,7 +473,7 @@ extern "C" bool IniFileSetBool(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWST Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -483,7 +497,7 @@ extern "C" bool IniFileDelete(LPCWSTR lpFilePath, LPCWSTR lpSectionName, LPCWSTR Ini.SetSpaces(s_bSetSpaces); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireWriteFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -506,7 +520,7 @@ extern "C" bool IniFileIterateSection(LPCWSTR lpFilePath, LPCWSTR lpSectionName, CSimpleIni Ini(s_bIsUTF8, s_bUseMultiKey, s_bUseMultiLine); OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(lpFilePath, ovrLpd); + HANDLE hFile = AcquireReadFileLock(lpFilePath, ovrLpd); if (hFile == INVALID_HANDLE_VALUE) { return false; } @@ -790,16 +804,17 @@ extern "C" bool CreateIniFile() } } else { - OVERLAPPED ovrLpd = { 0 }; - HANDLE hFile = AcquireFileLock(Globals.IniFile, ovrLpd); + HANDLE hFile = CreateFile(Globals.IniFile, + GENERIC_READ, FILE_SHARE_READ, + nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); if (hFile == INVALID_HANDLE_VALUE) { Globals.dwLastError = GetLastError(); - MsgBoxLastError(L"Accessing Settings-File failed!", Globals.dwLastError); + MsgBoxLastError(L"Read Access to Settings-File failed!", Globals.dwLastError); return result; } DWORD dwFSHigh = 0UL; dwFileSize = GetFileSize(hFile, &dwFSHigh); - ReleaseFileLock(hFile, ovrLpd); + CloseHandle(hFile); } if ((dwFileSize == 0) && (dwFileSize != INVALID_FILE_SIZE)) { diff --git a/src/VersionEx.h b/src/VersionEx.h index 728ce485a..10399468a 100644 --- a/src/VersionEx.h +++ b/src/VersionEx.h @@ -8,8 +8,8 @@ #define SAPPNAME "Notepad3" #define VERSION_MAJOR 5 #define VERSION_MINOR 20 -#define VERSION_REV 312 -#define VERSION_BUILD 6 +#define VERSION_REV 313 +#define VERSION_BUILD 1 #define SCINTILLA_VER 432 #define ONIGURUMA_REGEX_VER 6.9.4 #define UCHARDET_VER 2018.09.27