On 2017-02-24 02:52, hbelusca(a)svn.reactos.org wrote:
@@ -4419,12 +4422,31 @@
LPCWSTR UnSafepwc = pwc;
LPWORD UnSafepgi = pgi;
- if ((!UnSafepwc) && (!UnSafepgi)) return cwc;
-
- if ((UnSafepwc == NULL) || (UnSafepgi == NULL))
+ /* Check for integer overflow */
+ if (cwc & 0x80000000) // (INT_MAX + 1) == INT_MIN
+ return GDI_ERROR;
+
+ if (!UnSafepwc && !UnSafepgi)
+ return cwc;
+
+ if (!UnSafepwc || !UnSafepgi)
{
DPRINT1("UnSafepwc == %p, UnSafepgi = %p\n", UnSafepwc, UnSafepgi);
- return -1;
+ return GDI_ERROR;
+ }
+
+ // TODO: Special undocumented case!
+ if (!pwc && !pgi && (cwc == 0))
Why the sudden switch away from using the Unsafe version?
+ {
+ 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);