https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2737d9144db2afe7c39b58...
commit 2737d9144db2afe7c39b58cd9fd0a733524a046c Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Sat Nov 3 05:42:58 2018 +0900 Commit: GitHub noreply@github.com CommitDate: Sat Nov 3 05:42:58 2018 +0900
[WIN32SS][FONT] Define IntUnicodeStringToBuffer function and use it (#1004)
- Define IntUnicodeStringToBuffer function to copy the contents of a UNICODE_STRING to a string buffer with a UNICODE_NULL correctly. - Use it. JIRA issue: N/A --- win32ss/gdi/ntgdi/freetype.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-)
diff --git a/win32ss/gdi/ntgdi/freetype.c b/win32ss/gdi/ntgdi/freetype.c index 6e06763a69..55efa4ecc5 100644 --- a/win32ss/gdi/ntgdi/freetype.c +++ b/win32ss/gdi/ntgdi/freetype.c @@ -741,6 +741,21 @@ SubstituteFontByList(PLIST_ENTRY pHead, return FALSE; }
+static VOID +IntUnicodeStringToBuffer(LPWSTR pszBuffer, USHORT cbBuffer, const UNICODE_STRING *pString) +{ + USHORT cbLength = pString->Length; + + if (cbBuffer < sizeof(UNICODE_NULL)) + return; + + if (cbLength > cbBuffer - sizeof(UNICODE_NULL)) + cbLength = cbBuffer - sizeof(UNICODE_NULL); + + RtlCopyMemory(pszBuffer, pString->Buffer, cbLength); + pszBuffer[cbLength / sizeof(WCHAR)] = UNICODE_NULL; +} + static BOOL SubstituteFontRecurse(LOGFONTW* pLogFont) { @@ -763,7 +778,7 @@ SubstituteFontRecurse(LOGFONTW* pLogFont) if (!Found) break;
- RtlStringCchCopyW(pLogFont->lfFaceName, LF_FACESIZE, OutputNameW.Buffer); + IntUnicodeStringToBuffer(pLogFont->lfFaceName, sizeof(pLogFont->lfFaceName), &OutputNameW);
if (CharSetMap[FONTSUBST_FROM] == DEFAULT_CHARSET || CharSetMap[FONTSUBST_FROM] == pLogFont->lfCharSet) @@ -1037,8 +1052,8 @@ IntGdiLoadFontsFromMemory(PGDI_LOAD_FONT pLoadFont, EngSetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; /* failure */ } - RtlCopyMemory(FontGDI->Filename, pFileName->Buffer, pFileName->Length); - FontGDI->Filename[pFileName->Length / sizeof(WCHAR)] = UNICODE_NULL; + + IntUnicodeStringToBuffer(FontGDI->Filename, sizeof(FontGDI->Filename), pFileName); } else { @@ -2588,7 +2603,7 @@ FontFamilyFillInfo(PFONTFAMILYINFO Info, LPCWSTR FaceName, /* full name */ if (!FullName) FullName = (WCHAR*)((ULONG_PTR) Otm + (ULONG_PTR)Otm->otmpFaceName); - + RtlStringCbCopyW(Info->EnumLogFontEx.elfFullName, sizeof(Info->EnumLogFontEx.elfFullName), FullName); @@ -2815,7 +2830,7 @@ GetFontFamilyInfoForSubstitutes(LPLOGFONTW LogFont, continue; /* mismatch */ }
- RtlStringCchCopyW(lf.lfFaceName, LF_FACESIZE, pFromW->Buffer); + IntUnicodeStringToBuffer(lf.lfFaceName, sizeof(lf.lfFaceName), pFromW); SubstituteFontRecurse(&lf);
RtlInitUnicodeString(&NameW, lf.lfFaceName); @@ -4986,9 +5001,7 @@ TextIntRealizeFont(HFONT FontHandle, PTEXTOBJ pTextObj) if (NT_SUCCESS(Status)) { /* truncated copy */ - Name.Length = (USHORT)min(Name.Length, (LF_FACESIZE - 1) * sizeof(WCHAR)); - RtlStringCbCopyNW(TextObj->TextFace, Name.Length + sizeof(WCHAR), Name.Buffer, Name.Length); - + IntUnicodeStringToBuffer(TextObj->TextFace, sizeof(TextObj->TextFace), &Name); RtlFreeUnicodeString(&Name); } }