[PATCH:libXrandr] XRRGetProviderInfo returned bad associated_capability list in 64-bit

Dave Airlie airlied at gmail.com
Sun Jun 30 20:37:05 PDT 2013


On Mon, Jul 1, 2013 at 10:03 AM, Alan Coopersmith
<alan.coopersmith at oracle.com> wrote:
> Unlike most of the values returned by this function, which are arrays
> of XIDs (long int), associated_capability is defined as an array of
> unsigned int.   _XRead32 reads 32-bit values from the wire protocol
> and writes them to the provided buffer as an array of long ints, even
> if that means expanding them from 32-bit to 64-bit.   Doing that for
> associated_capability resulted in a garbage value between each actual
> value, and overflowing the provided buffer into the space for the
> provider name (which is written later and would overwrite the overflowed
> data).
>
> Created xhiv libXrandr/XRRGetProviderInfo test case to test & confirm.

Reviewed-by: Dave Airlie <airlied at redhat.com>

Protocol handling is just all a trap waiting to screw you.

Dave.

>
> Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
> ---
>  src/XrrProvider.c |   11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/src/XrrProvider.c b/src/XrrProvider.c
> index 309e321..014ddd9 100644
> --- a/src/XrrProvider.c
> +++ b/src/XrrProvider.c
> @@ -156,7 +156,16 @@ XRRGetProviderInfo(Display *dpy, XRRScreenResources *resources, RRProvider provi
>      _XRead32(dpy, xpi->outputs, rep.nOutputs << 2);
>
>      _XRead32(dpy, xpi->associated_providers, rep.nAssociatedProviders << 2);
> -    _XRead32(dpy, xpi->associated_capability, rep.nAssociatedProviders << 2);
> +
> +    /*
> +     * _XRead32 reads a series of 32-bit values from the protocol and writes
> +     * them out as a series of "long int" values, but associated_capability
> +     * is defined as unsigned int *, so that won't work for this array.
> +     * Instead we assume for now that "unsigned int" is also 32-bits, so
> +     * the values can be read without any conversion.
> +     */
> +    _XRead(dpy, (char *) xpi->associated_capability,
> +           rep.nAssociatedProviders << 2);
>
>      _XReadPad(dpy, xpi->name, rep.nameLength);
>      xpi->name[rep.nameLength] = '\0';
> --
> 1.7.9.2
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list