xserver-multidpi/dix
Aaron Plattner 2edadf26f1 os: Don't crash in AttendClient if the client is gone
If a client is in the process of being closed down, then its client->osPrivate
pointer will be set to NULL by CloseDownConnection. This can cause a crash if
freeing the client's resources results in a call to AttendClient. For example,
if the client has a pending sync fence:

 Thread 1 "X" received signal SIGSEGV, Segmentation fault.
 AttendClient (client=0x5571c4aed9a0) at ../os/connection.c:942
 (gdb) bt
 #0  AttendClient (client=0x5571c4aed9a0) at ../os/connection.c:942
 #1  0x00005571c3dbb865 in SyncAwaitTriggerFired (pTrigger=<optimized out>) at ../Xext/sync.c:694
 #2  0x00005571c3dd5749 in miSyncDestroyFence (pFence=0x5571c5063980) at ../miext/sync/misync.c:120
 #3  0x00005571c3dbbc69 in FreeFence (obj=<optimized out>, id=<optimized out>) at ../Xext/sync.c:1909
 #4  0x00005571c3d7a01d in doFreeResource (res=0x5571c506e3d0, skip=skip@entry=0) at ../dix/resource.c:880
 #5  0x00005571c3d7b1dc in FreeClientResources (client=0x5571c4aed9a0) at ../dix/resource.c:1146
 #6  FreeClientResources (client=0x5571c4aed9a0) at ../dix/resource.c:1109
 #7  0x00005571c3d5525f in CloseDownClient (client=0x5571c4aed9a0) at ../dix/dispatch.c:3473
 #8  0x00005571c3d55eeb in Dispatch () at ../dix/dispatch.c:492
 #9  0x00005571c3d59e96 in dix_main (argc=3, argv=0x7ffe7854bc28, envp=<optimized out>) at ../dix/main.c:276
 #10 0x00007fea4837cb6b in __libc_start_main (main=0x5571c3d1d060 <main>, argc=3, argv=0x7ffe7854bc28, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffe7854bc18) at ../csu/libc-start.c:308
 #11 0x00005571c3d1d09a in _start () at ../Xext/sync.c:2378
 (gdb) print client->osPrivate
 $1 = (void *) 0x0

Since the client is about to be freed, its ignore count doesn't matter and
AttendClient can simply be a no-op. Check for client->clientGone in AttendClient
and remove similar checks from two callers that had them.

Signed-off-by: Aaron Plattner <aplattner@nvidia.com>
(cherry picked from commit 4308f5d3d1)
2019-11-20 11:18:28 -08:00
..
.gitignore dix and os: gitignore dix.O and os.O 2011-09-23 17:14:47 -07:00
BuiltInAtoms R6.6 is the Xorg base-line 2003-11-14 15:54:54 +00:00
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 XFree86 4.3.0.1 2003-11-14 16:49:22 +00:00
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 dix: Call SourceValidate before GetImage 2019-11-18 14:23:38 -05: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 os: Don't crash in AttendClient if the client is gone 2019-11-20 11:18:28 -08: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 mi: Add a default no-op miSourceValidate 2019-11-18 14:23:15 -05: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