https://git.reactos.org/?p=reactos.git;a=commitdiff;h=49fcbe7cd8531178970ffe48f91f3dc4d68022d1
commit 49fcbe7cd8531178970ffe48f91f3dc4d68022d1 Author: Jérôme Gardou <[email protected]> AuthorDate: Mon May 17 16:14:26 2021 +0200 Commit: Jérôme Gardou <[email protected]> CommitDate: Wed May 19 22:50:29 2021 +0200 [RTL] Fix RtlIsValidOemCharacter implementation for Multibyte code pages CORE-17571 --- sdk/lib/rtl/unicode.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/sdk/lib/rtl/unicode.c b/sdk/lib/rtl/unicode.c index 7f045401326..e1896497ce6 100644 --- a/sdk/lib/rtl/unicode.c +++ b/sdk/lib/rtl/unicode.c @@ -519,16 +519,24 @@ RtlIsValidOemCharacter(IN PWCHAR Char) /* If multi-byte code page present */ if (NlsMbOemCodePageTag) { - USHORT Offset = 0; + USHORT Offset; OemChar = NlsUnicodeToMbOemTable[*Char]; /* If character has Lead Byte */ - if (NlsOemLeadByteInfo[HIBYTE(OemChar)]) - Offset = NlsOemLeadByteInfo[HIBYTE(OemChar)]; + Offset = NlsOemLeadByteInfo[HIBYTE(OemChar)]; + if (Offset) + { + /* Use DBCS table */ + UnicodeChar = NlsOemLeadByteInfo[Offset + LOBYTE(OemChar)]; + } + else + { + UnicodeChar = NlsOemToUnicodeTable[OemChar]; + } - /* Receive Unicode character from the table */ - UnicodeChar = RtlpUpcaseUnicodeChar(NlsOemToUnicodeTable[LOBYTE(OemChar) + Offset]); + /* Upcase */ + UnicodeChar = RtlpUpcaseUnicodeChar(UnicodeChar); /* Receive OEM character from the table */ OemChar = NlsUnicodeToMbOemTable[UnicodeChar]; @@ -544,7 +552,10 @@ RtlIsValidOemCharacter(IN PWCHAR Char) /* Not valid character, failed */ if (OemChar == NlsOemDefaultChar) + { + DPRINT1("\\u%04x is not valid for OEM\n", *Char); return FALSE; + } *Char = UnicodeChar;
