xserver/dix
Matt Turner fada61e89d dix: Assert noPanoramiXExtension is false in PanoramiX code
When compiling with link time optimization, GCC thinks it's discovered
undefined behavior:

events.c: In function 'XineramaConfineCursorToWindow':
events.c:609:13: warning: iteration 2147483647 invokes undefined behavior [-Waggressive-loop-optimizations]
events.c:609:11: note: within this loop
events.c:605:49: warning: array subscript -1 is below array bounds of 'struct _Window *[16]' [-Warray-bounds]
events.c:606:31: warning: array subscript -1 is below array bounds of 'struct _Screen *[16]' [-Warray-bounds]
events.c:610:39: warning: array subscript -2 is below array bounds of 'struct _Screen *[16]' [-Warray-bounds]
events.c:617:38: warning: array subscript -2 is below array bounds of 'struct _Window *[16]' [-Warray-bounds]
events.c:619:35: warning: array subscript -2 is below array bounds of 'struct _Screen *[16]' [-Warray-bounds]

This results from

    i = PanoramiXNumScreens - 1;

    RegionCopy(&pSprite->Reg1, &pSprite->windows[i]->borderSize);
    off_x = screenInfo.screens[i]->x;
    off_y = screenInfo.screens[i]->y;

where GCC believes that PanoramiXNumScreens might be 0. Unfortunately
GCC is just smart enough to be an annoyance because this case is not
actually possible: XineramaConfineCursorToWindow() is only called when
noPanoramiXExtension is false, and if noPanoramiXExtension is false then
PanoramiXNumScreens must be >1 (see PanoramiXExtensionInit()).

So, add an assert(!noPanoramiXExtension), which to my surprise provides
GCC with information even in release builds and lets GCC understand that
the code is not doing anything that is undefined behavior.

I chose this solution instead of the proposed assert(i >= 0) because the
same pattern occurs in CheckVirtualMotion() but is inside an
'if (!noPanoramiXExtension)' and does not generate any warnings.

Fixes: xorg/xserver#590
Signed-off-by: Matt Turner <mattst88@gmail.com>
(cherry picked from commit 61aa40aeb3)
2019-10-29 15:01:20 -07:00
..
.gitignore dix and os: gitignore dix.O and os.O 2011-09-23 17:14:47 -07:00
BuiltInAtoms
Makefile.am dix: Remove ffs.c 2017-11-06 17:22:46 -05:00
Xserver-dtrace.h.in dix: add dtrace probes to input API 2012-03-22 11:33:42 +10:00
Xserver.d dix: unbreak --with-dtrace (default) on FreeBSD 11.1+ 2017-07-31 13:32:35 -04:00
atom.c atom: make FreeAtom static 2015-07-08 16:41:29 -04:00
buildatoms
colormap.c configurable maximum number of clients 2015-08-24 00:00:18 -07:00
cursor.c dix: Work around non-premultiplied ARGB cursor data 2016-07-15 09:53:07 -04:00
devices.c devices: break after finding and removing device from lists 2018-10-04 17:26:57 +02:00
dispatch.c Unvalidated extra length in ProcEstablishConnection (CVE-2017-12176) 2017-10-10 23:33:44 +02:00
dispatch.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
dixfonts.c dix: Fix a warning about GetTimeInMillis return value in XFont2. 2018-05-08 11:59:28 -04:00
dixutils.c dix: ensure work queues are cleared on reset 2019-03-21 10:29:04 -04:00
enterleave.c dix: always send focus event on grab change 2018-04-10 14:50:08 -04:00
enterleave.h dix: Unexport various implementation details 2015-07-08 16:40:57 -04:00
eventconvert.c Use ARRAY_SIZE all over the tree 2017-10-30 13:45:20 -04:00
events.c dix: Assert noPanoramiXExtension is false in PanoramiX code 2019-10-29 15:01:20 -07:00
extension.c dix: Allow an extension to disable itself 2018-04-24 14:36:04 -04:00
gc.c Use ARRAY_SIZE all over the tree 2017-10-30 13:45:20 -04:00
getevents.c dix: leave last.valuators alone on slave switch 2019-05-28 14:21:57 -04:00
globals.c dpms: Consolidate a bunch of stuff into Xext/dpms.c 2017-03-27 15:59:47 -04:00
glyphcurs.c Let calloc handle multiplication 2015-04-21 16:57:07 -07:00
grabs.c Convert dix/* to new *allocarray functions 2015-04-21 16:57:08 -07:00
initatoms.c Introduce a consistent coding style 2012-03-21 13:54:42 -07:00
inpututils.c dix: check_modmap_change() returns Success, not true 2018-10-04 17:23:48 +02:00
main.c dix: ensure work queues are cleared on reset 2019-03-21 10:29:04 -04:00
meson.build meson: Fix installing protocol.txt 2018-03-27 10:13:18 -04:00
pixmap.c Make PixmapDirtyUpdateRec::src a DrawablePtr 2017-08-15 17:01:39 +09:00
privates.c Use ARRAY_SIZE all over the tree 2017-10-30 13:45:20 -04:00
property.c dix: Add a callback chain for window property state change 2017-02-23 13:30:11 -05:00
protocol.txt protocol.txt: add GLX req. 35 - SetClientInfo2ARB 2018-02-27 13:08:35 -05:00
ptrveloc.c Remove SIGIO support for input [v5] 2016-05-26 16:07:54 -07:00
region.c Convert dix/* to new *allocarray functions 2015-04-21 16:57:08 -07:00
registry.c Build required portions of registry.c automatically [v2] 2014-09-18 15:29:29 -07:00
resource.c dix: Bump MAXHASHSIZE for the resource db [v2] 2016-10-28 09:28:32 -07:00
selection.c dix: Push UpdateCurrentTimeIf down out of the main loop 2016-05-04 10:58:01 -04:00
stubmain.c Allow DDX to provide a main() 2013-07-23 23:56:58 +01:00
swaprep.c dispatch: Mark swapped dispatch as _X_COLD 2017-03-01 10:16:20 -05:00
swapreq.c dix: Disallow GenericEvent in SendEvent request. 2017-06-19 11:58:50 +10:00
tables.c Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
touch.c dix: Reallocate touchpoint buffer at input event time [v2] 2016-05-26 16:07:54 -07:00
window.c dix/window: fix typos 2017-11-06 16:46:32 -05:00