mirror of
https://github.com/reactos/reactos.git
synced 2024-08-19 09:59:44 +00:00
[NTGDI]: Few fixes & hacks for NtGdiGetGlyphIndicesW, see CORE-12825:
- (Fix) Check for integer count overflow (per Thomas suggestion), - (Hack#1) Signal the particular calling case (where pwc == NULL == pgi and cwc == 0), as discovered by the testcase of r73894, - (Hack#2) Return error when cwc == 0 alone (triggered by e.g. Word 2010). svn path=/trunk/; revision=73895
This commit is contained in:
parent
1f67849a7e
commit
2a81b18aee
|
@ -4393,6 +4393,9 @@ NtGdiGetCharWidthW(
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
|
// TODO: Move this code into NtGdiGetGlyphIndicesWInternal and wrap
|
||||||
|
// NtGdiGetGlyphIndicesW around NtGdiGetGlyphIndicesWInternal instead.
|
||||||
|
// NOTE: See also GreGetGlyphIndicesW.
|
||||||
__kernel_entry
|
__kernel_entry
|
||||||
W32KAPI
|
W32KAPI
|
||||||
DWORD
|
DWORD
|
||||||
|
@ -4408,7 +4411,7 @@ NtGdiGetGlyphIndicesW(
|
||||||
PDC_ATTR pdcattr;
|
PDC_ATTR pdcattr;
|
||||||
PTEXTOBJ TextObj;
|
PTEXTOBJ TextObj;
|
||||||
PFONTGDI FontGDI;
|
PFONTGDI FontGDI;
|
||||||
HFONT hFont = 0;
|
HFONT hFont = NULL;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
OUTLINETEXTMETRICW *potm;
|
OUTLINETEXTMETRICW *potm;
|
||||||
INT i;
|
INT i;
|
||||||
|
@ -4419,12 +4422,31 @@ NtGdiGetGlyphIndicesW(
|
||||||
LPCWSTR UnSafepwc = pwc;
|
LPCWSTR UnSafepwc = pwc;
|
||||||
LPWORD UnSafepgi = pgi;
|
LPWORD UnSafepgi = pgi;
|
||||||
|
|
||||||
if ((!UnSafepwc) && (!UnSafepgi)) return cwc;
|
/* Check for integer overflow */
|
||||||
|
if (cwc & 0x80000000) // (INT_MAX + 1) == INT_MIN
|
||||||
|
return GDI_ERROR;
|
||||||
|
|
||||||
if ((UnSafepwc == NULL) || (UnSafepgi == NULL))
|
if (!UnSafepwc && !UnSafepgi)
|
||||||
|
return cwc;
|
||||||
|
|
||||||
|
if (!UnSafepwc || !UnSafepgi)
|
||||||
{
|
{
|
||||||
DPRINT1("UnSafepwc == %p, UnSafepgi = %p\n", UnSafepwc, UnSafepgi);
|
DPRINT1("UnSafepwc == %p, UnSafepgi = %p\n", UnSafepwc, UnSafepgi);
|
||||||
return -1;
|
return GDI_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Special undocumented case!
|
||||||
|
if (!pwc && !pgi && (cwc == 0))
|
||||||
|
{
|
||||||
|
DPRINT1("ERR: NtGdiGetGlyphIndicesW with (!pwc && !pgi && (cwc == 0)) is UNIMPLEMENTED!\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: This is a hack!! (triggered by e.g. Word 2010). See CORE-12825
|
||||||
|
if (cwc == 0)
|
||||||
|
{
|
||||||
|
DPRINT1("ERR: NtGdiGetGlyphIndicesW with (cwc == 0) is UNIMPLEMENTED!\n");
|
||||||
|
return GDI_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
dc = DC_LockDc(hdc);
|
dc = DC_LockDc(hdc);
|
||||||
|
|
Loading…
Reference in a new issue