summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2014-05-22 10:43:52 +1200
committerKeith Packard <keithp@keithp.com>2014-06-02 11:19:49 -0700
commit0df871cf34ee5f1a85586206027de9b02fb364ec (patch)
tree628d4d67b3119951bc893715e29086aa97d93e32
parent4cbd3fabaa41e89579530bceb01b9239fa2afdb7 (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.h18
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 */