- Don't copy data to null buffer, just return the string length in this case

- Fix some buffer calculation problems, handle buffer termination if it's shorter than the font string
- Fixes >= 10 gdi32 font winetests (NtGdiGetTextFaceW/NtGdiGetTextFaceA related)

svn path=/trunk/; revision=40469
This commit is contained in:
Gregor Schneider 2009-04-11 21:24:25 +00:00
parent 9e3589a7b1
commit 72585aa30d

View file

@ -326,6 +326,7 @@ NtGdiGetTextFaceW(
HFONT hFont; HFONT hFont;
PTEXTOBJ TextObj; PTEXTOBJ TextObj;
NTSTATUS Status; NTSTATUS Status;
INT fLen, ret;
/* FIXME: Handle bAliasName */ /* FIXME: Handle bAliasName */
@ -341,16 +342,32 @@ NtGdiGetTextFaceW(
TextObj = RealizeFontInit(hFont); TextObj = RealizeFontInit(hFont);
ASSERT(TextObj != NULL); ASSERT(TextObj != NULL);
Count = min(Count, wcslen(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName)); fLen = wcslen(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName) + 1;
Status = MmCopyToCaller(FaceName, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName, Count * sizeof(WCHAR));
TEXTOBJ_UnlockText(TextObj); if (FaceName != NULL)
if (!NT_SUCCESS(Status))
{ {
SetLastNtError(Status); Count = min(Count, fLen);
return 0; Status = MmCopyToCaller(FaceName, TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfFaceName, Count * sizeof(WCHAR));
if (!NT_SUCCESS(Status))
{
TEXTOBJ_UnlockText(TextObj);
SetLastNtError(Status);
return 0;
}
/* Terminate if we copied only part of the font name */
if (Count > 0 && Count < fLen)
{
FaceName[Count - 1] = '\0';
}
ret = Count;
}
else
{
ret = fLen;
} }
return Count; TEXTOBJ_UnlockText(TextObj);
return ret;
} }
W32KAPI W32KAPI