[FarGroup/FarManager] master: 0003940: Editor crash when changing codepage to UTF16BE (89678c64c)

0 views
Skip to first unread message

farg...@farmanager.com

unread,
Apr 24, 2022, 12:30:43 PM4/24/22
to farco...@googlegroups.com
Repository : https://github.com/FarGroup/FarManager
On branch : master
Link : https://github.com/FarGroup/FarManager/commit/89678c64c0a8c67a800e7ae10f49755a6330aa22

>---------------------------------------------------------------

commit 89678c64c0a8c67a800e7ae10f49755a6330aa22
Author: Alex Alabuzhev <alab...@gmail.com>
Date: Sun Apr 24 17:16:55 2022 +0100

0003940: Editor crash when changing codepage to UTF16BE


>---------------------------------------------------------------

89678c64c0a8c67a800e7ae10f49755a6330aa22
far/changelog | 5 +++++
far/codepage_selection.cpp | 33 ++++++++++++++++++++++++++-------
far/encoding.cpp | 11 +++++++++++
far/vbuild.m4 | 2 +-
4 files changed, 43 insertions(+), 8 deletions(-)

diff --git a/far/changelog b/far/changelog
index 33e91f773..b1121ef67 100644
--- a/far/changelog
+++ b/far/changelog
@@ -1,3 +1,8 @@
+--------------------------------------------------------------------------------
+drkns 24.04.2022 17:14:58 +0100 - build 5966
+
+1. 0003940: Editor crash when changing codepage to UTF16BE.
+
--------------------------------------------------------------------------------
drkns 18.04.2022 03:16:06 +0100 - build 5965

diff --git a/far/codepage_selection.cpp b/far/codepage_selection.cpp
index d457702af..ad1b90a47 100644
--- a/far/codepage_selection.cpp
+++ b/far/codepage_selection.cpp
@@ -303,6 +303,17 @@ size_t codepages::GetCodePageInsertPosition(uintptr_t codePage, size_t start, si
return Pos != iRange.cend()? *Pos : start + length;
}

+static string_view unicode_codepage_name(uintptr_t const Codepage)
+{
+ switch (Codepage)
+ {
+ case CP_UTF8: return L"UTF-8"sv;
+ case CP_UNICODE: return L"UTF-16 (Little endian)"sv;
+ case CP_REVERSEBOM: return L"UTF-16 (Big endian)"sv;
+ default: return {};
+ }
+}
+
// Добавляем все необходимые таблицы символов
void codepages::AddCodePages(DWORD codePages)
{
@@ -362,9 +373,9 @@ void codepages::AddCodePages(DWORD codePages)
// unicode codepages
//
AddSeparator(msg(lng::MGetCodePageUnicode));
- AddStandardCodePage(L"UTF-8"sv, CP_UTF8, -1, true);
- AddStandardCodePage(L"UTF-16 (Little endian)"sv, CP_UNICODE);
- AddStandardCodePage(L"UTF-16 (Big endian)"sv, CP_REVERSEBOM);
+ AddStandardCodePage(unicode_codepage_name(CP_UTF8), CP_UTF8, -1, true);
+ AddStandardCodePage(unicode_codepage_name(CP_UNICODE), CP_UNICODE);
+ AddStandardCodePage(unicode_codepage_name(CP_REVERSEBOM), CP_REVERSEBOM);

// other codepages
//
@@ -795,10 +806,18 @@ std::optional<cp_info> codepages::GetInfo(uintptr_t CodePage)

string codepages::FormatName(uintptr_t const CodePage)
{
- const auto Info = GetCodePageInfo(CodePage);
- auto Name = Info? Info->Name : L"Unknown"s;
- GetCodePageCustomName(CodePage, Name);
- return format(FSTR(L"{}: {}"sv), CodePage, Name);
+ const auto get_name = [&]
+ {
+ if (const auto Name = unicode_codepage_name(CodePage); !Name.empty())
+ return string(Name);
+
+ const auto Info = GetCodePageInfo(CodePage);
+ auto Name = Info? Info->Name : L"Unknown"s;
+ GetCodePageCustomName(CodePage, Name);
+ return Name;
+ };
+
+ return format(FSTR(L"{}: {}"sv), CodePage, get_name());
}

string codepages::UnsupportedCharacterMessage(wchar_t const Char)
diff --git a/far/encoding.cpp b/far/encoding.cpp
index 54cb6505c..ff1a56a8d 100644
--- a/far/encoding.cpp
+++ b/far/encoding.cpp
@@ -515,6 +515,15 @@ static size_t get_chars_impl(uintptr_t const Codepage, std::string_view Str, spa
if (Str.empty())
return 0;

+ const auto validate_unicode = [&]
+ {
+ if (Str.size() & 1 && Diagnostics && Diagnostics->EnabledDiagnostics & encoding::diagnostics::incomplete_bytes)
+ {
+ Diagnostics->ErrorPosition = Str.size() - 1;
+ Diagnostics->IncompleteBytes = 1;
+ }
+ };
+
switch (Codepage)
{
case CP_UTF8:
@@ -525,10 +534,12 @@ static size_t get_chars_impl(uintptr_t const Codepage, std::string_view Str, spa

case CP_UNICODE:
copy_memory(Str.data(), Buffer.data(), std::min(Str.size(), Buffer.size() * sizeof(wchar_t)));
+ validate_unicode();
return Str.size() / sizeof(wchar_t);

case CP_REVERSEBOM:
swap_bytes(Str.data(), Buffer.data(), std::min(Str.size(), Buffer.size() * sizeof(wchar_t)));
+ validate_unicode();
return Str.size() / sizeof(wchar_t);

default:
diff --git a/far/vbuild.m4 b/far/vbuild.m4
index bc6ec0d5e..106a6f984 100644
--- a/far/vbuild.m4
+++ b/far/vbuild.m4
@@ -1 +1 @@
-5965
+5966


Reply all
Reply to author
Forward
0 new messages