diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2014-05-22 10:43:52 +1200 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2014-06-27 09:47:52 +1000 |
commit | 2ceb44827f86d9f5f995448c3cf603ee9459fef3 (patch) | |
tree | 701dc6e2897d5ccad6106ad9cb6bf6f1d53bf0db | |
parent | 416ea95d8018875ed77a46634e5ab4d8b6e94dec (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.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Keith Packard <keithp@keithp.com>
(cherry picked from commit 548fc937b22d4dfe7f96e0bd77522261603a2c2f)
-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 */ |