From 69457711050ac3a53859ef11790a7ac815cd7d94 Mon Sep 17 00:00:00 2001 From: Alan Coopersmith Date: Sat, 13 Apr 2013 10:34:22 -0700 Subject: Use _XEatDataWords to avoid overflow of rep.length shifting rep.length is a CARD32, so rep.length << 2 could overflow in 32-bit builds Signed-off-by: Alan Coopersmith --- configure.ac | 6 ++++++ src/XRes.c | 16 ++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 90205cc..f68b689 100644 --- a/configure.ac +++ b/configure.ac @@ -50,6 +50,12 @@ XORG_CHECK_MALLOC_ZERO # Obtain compiler/linker options for depedencies PKG_CHECK_MODULES(XRES, x11 xext xextproto [resourceproto >= 1.2.0]) +# Check for _XEatDataWords function that may be patched into older Xlib release +SAVE_LIBS="$LIBS" +LIBS="$XRES_LIBS" +AC_CHECK_FUNCS([_XEatDataWords]) +LIBS="$SAVE_LIBS" + AC_CONFIG_FILES([Makefile src/Makefile man/Makefile diff --git a/src/XRes.c b/src/XRes.c index 1744196..1ab1db8 100644 --- a/src/XRes.c +++ b/src/XRes.c @@ -13,6 +13,18 @@ #include #include #include +#include + +#ifndef HAVE__XEATDATAWORDS +static inline void _XEatDataWords(Display *dpy, unsigned long n) +{ +# ifndef LONG64 + if (n >= (ULONG_MAX >> 2)) + _XIOError(dpy); +# endif + _XEatData (dpy, n << 2); +} +#endif static XExtensionInfo _xres_ext_info_data; static XExtensionInfo *xres_ext_info = &_xres_ext_info_data; @@ -131,7 +143,7 @@ Status XResQueryClients ( *num_clients = rep.num_clients; result = 1; } else { - _XEatData(dpy, rep.length << 2); + _XEatDataWords(dpy, rep.length); } } @@ -183,7 +195,7 @@ Status XResQueryClientResources ( *num_types = rep.num_types; result = 1; } else { - _XEatData(dpy, rep.length << 2); + _XEatDataWords(dpy, rep.length); } } -- cgit v1.2.1