diff options
author | Alan Coopersmith <alan.coopersmith@oracle.com> | 2013-04-13 00:28:34 -0700 |
---|---|---|
committer | Alan Coopersmith <alan.coopersmith@oracle.com> | 2013-04-13 00:39:00 -0700 |
commit | 79362c764a6df7e7fbe5247756bdbf60f3a58baf (patch) | |
tree | 412dd4844be4a3e7a1d58a8acc710b75b1d0e109 | |
parent | ed13edeac5adc2e6afcd87f63b5ae1ff9ad47958 (diff) |
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 <alan.coopersmith@oracle.com>
-rw-r--r-- | configure.ac | 6 | ||||
-rw-r--r-- | src/Xv.c | 22 |
2 files changed, 25 insertions, 3 deletions
diff --git a/configure.ac b/configure.ac index 5494b5d..6a335db 100644 --- a/configure.ac +++ b/configure.ac @@ -43,6 +43,12 @@ XORG_CHECK_MALLOC_ZERO # Obtain compiler/linker options for depedencies PKG_CHECK_MODULES(XV, x11 xext xextproto videoproto) +# Check for _XEatDataWords function that may be patched into older Xlib release +SAVE_LIBS="$LIBS" +LIBS="$XV_LIBS" +AC_CHECK_FUNCS([_XEatDataWords]) +LIBS="$SAVE_LIBS" + # Allow checking code with lint, sparse, etc. XORG_WITH_LINT XORG_LINT_LIBRARY([Xv]) @@ -49,11 +49,27 @@ SOFTWARE. ** */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include <stdio.h> #include "Xvlibint.h" #include <X11/extensions/Xext.h> #include <X11/extensions/extutil.h> #include <X11/extensions/XShm.h> +#include <limits.h> + +#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 _xv_info_data; static XExtensionInfo *xv_info = &_xv_info_data; @@ -853,7 +869,7 @@ XvQueryPortAttributes(Display *dpy, XvPortID port, int *num) (*num)++; } } else - _XEatData(dpy, rep.length << 2); + _XEatDataWords(dpy, rep.length); } UnlockDisplay(dpy); @@ -923,7 +939,7 @@ XvImageFormatValues * XvListImageFormats ( (*num)++; } } else - _XEatData(dpy, rep.length << 2); + _XEatDataWords(dpy, rep.length); } UnlockDisplay(dpy); @@ -976,7 +992,7 @@ XvImage * XvCreateImage ( _XRead(dpy, (char*)(ret->pitches), rep.num_planes << 2); _XRead(dpy, (char*)(ret->offsets), rep.num_planes << 2); } else - _XEatData(dpy, rep.length << 2); + _XEatDataWords(dpy, rep.length); UnlockDisplay(dpy); SyncHandle(); |