[PATCH] Fix overflow checking extension versions

Robert Ancell robert.ancell at canonical.com
Thu May 22 18:11:46 PDT 2014


I changed it to 32 bits because (at least) RANDR uses 32 bits for each
version number [1]:

RRQueryVersion
client-major-version: CARD32
client-minor-version: CARD32
▶
major-version: CARD32
minor-version: CARD32

This was the request I was sending where X said it supported RANDR
4294967295.4294967295.

[1] http://cgit.freedesktop.org/xorg/proto/randrproto/tree/randrproto.txt

On Fri, May 23, 2014 at 1:05 PM, Keith Packard <keithp at keithp.com> wrote:
> Robert Ancell <robert.ancell at canonical.com> writes:
>
>> The easiest way to check for the version of an extension is to send the maximum
>> possible version numbers in the QueryVersion request. The X server overflows on
>> these as it assumes you will send a reasonable version number.
>> ---
>>  include/misc.h | 18 +++++++++++-------
>>  1 file changed, 11 insertions(+), 7 deletions(-)
>>
>> diff --git a/include/misc.h b/include/misc.h
>> index 17de710..9c2f573 100644
>> --- a/include/misc.h
>> +++ b/include/misc.h
>> @@ -259,15 +259,19 @@ extern void FormatDouble(double dbl, char *string);
>>   * or a value greater than 0
>>   */
>>  static inline int
>> -version_compare(uint16_t a_major, uint16_t a_minor,
>> -                uint16_t b_major, uint16_t b_minor)
>> +version_compare(uint32_t a_major, uint32_t a_minor,
>> +                uint32_t b_major, uint32_t b_minor)
>
> I don't see any particular reason to change the signature of this
> function; the rest of the rewrite should work with 16-bit ints.
>
>>  {
>> -    int a, b;
>
> Just changing these to uint32_t and fixing the test to
>
>         if (a > b)
>                 return 1;
>         if (a < b)
>                 return -1;
>         return 0;
>
> would suffice, assuming everything is 16-bit ints.
>
> --
> keith.packard at intel.com


More information about the xorg-devel mailing list