[ros-dev] [ros-diffs] [hbelusca] 73895: [NTGDI]: Few fixes & hacks for NtGdiGetGlyphIndicesW, see CORE-12825: - (Fix) Check for integer count overflow (per Thomas suggestion), - (Hack#1) Signal the particular calling ca...

Thomas Faber thomas.faber at reactos.org
Fri Feb 24 13:42:01 UTC 2017


On 2017-02-24 02:52, hbelusca at 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);
>
>




More information about the Ros-dev mailing list