From 30f2ad79498910848aacdf2b03de88372f21556e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Mon, 17 May 2021 17:40:26 +0200 Subject: [PATCH] [RTL] Properly truncate 8dot3 names when using a MultiByte OEM code page CORE-17571 --- sdk/lib/rtl/dos8dot3.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/sdk/lib/rtl/dos8dot3.c b/sdk/lib/rtl/dos8dot3.c index 05301fd444f..1f9ead5e832 100644 --- a/sdk/lib/rtl/dos8dot3.c +++ b/sdk/lib/rtl/dos8dot3.c @@ -102,8 +102,9 @@ RtlGenerate8dot3Name(IN PUNICODE_STRING Name, DotPos = Index; } - /* Copy name (6 valid characters max) */ - for (Index = 0; Index < DotPos && Context->NameLength < 6; Index++) + /* Copy name. OEM string length can't exceed 6. */ + UCHAR OemSizeLeft = 6; + for (Index = 0; (Index < DotPos) && OemSizeLeft; Index++) { Char = Name->Buffer[Index]; @@ -115,8 +116,17 @@ RtlGenerate8dot3Name(IN PUNICODE_STRING Name, else if (Char >= L'a' && Char <= L'z') Char = RtlpUpcaseUnicodeChar(Char); + /* Beware of MB OEM codepage */ + if (NlsMbOemCodePageTag && HIBYTE(NlsUnicodeToMbOemTable[Char])) + { + if (OemSizeLeft < 2) + break; + OemSizeLeft--; + } + Context->NameBuffer[Context->NameLength] = Char; - ++Context->NameLength; + Context->NameLength++; + OemSizeLeft--; } }