diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2014-05-22 10:43:52 +1200 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2014-06-02 11:19:49 -0700 |
commit | 0df871cf34ee5f1a85586206027de9b02fb364ec (patch) | |
tree | 628d4d67b3119951bc893715e29086aa97d93e32 | |
parent | 4cbd3fabaa41e89579530bceb01b9239fa2afdb7 (diff) |
Fix overflow checking extension versions
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.
Reviewed-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r-- | include/misc.h | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/include/misc.h b/include/misc.h index 17de71041..9c2f573b9 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) { - int a, b; + if (a_major > b_major) + return 1; + if (a_major < b_major) + return -1; + if (a_minor > b_minor) + return 1; + if (a_minor < b_minor) + return -1; - a = a_major << 16 | a_minor; - b = b_major << 16 | b_minor; - - return (a - b); + return 0; } /* some macros to help swap requests, replies, and events */ |