xserver/dix
Aaron Plattner 4308f5d3d1 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>
2019-11-19 10:15:05 -08:00
..
.gitignore dtrace: Move Xserver.d from dix/ to include/ 2019-08-27 17:38:54 -04:00
BuiltInAtoms
Makefile.am dtrace: Move Xserver.d from dix/ to include/ 2019-08-27 17:38:54 -04:00
atom.c
buildatoms
colormap.c
cursor.c dix: Remove -fn and -fc options to set default text/cursor fonts 2019-10-30 16:17:04 +00:00
devices.c include: Remove now-empty site.h 2019-10-30 16:17:04 +00:00
dispatch.c dix: Call SourceValidate before GetImage 2019-10-30 16:26:01 +00:00
dispatch.h
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-19 10:15:05 -08:00
enterleave.c
enterleave.h
eventconvert.c
events.c dix: Assert noPanoramiXExtension is false in PanoramiX code 2019-08-09 20:45:01 -07:00
extension.c
gc.c
getevents.c dtrace: s/#if/#ifdef/ for XSERVER_DTRACE 2019-08-27 17:38:59 -04:00
globals.c include: Remove now-empty site.h 2019-10-30 16:17:04 +00:00
glyphcurs.c
grabs.c
initatoms.c
inpututils.c dix: Remove LegalModifier() 2018-09-28 16:25:17 -04:00
main.c include: Remove now-empty site.h 2019-10-30 16:17:04 +00:00
meson.build meson: Add dtrace support 2019-08-27 17:38:59 -04:00
pixmap.c mi: Add a default no-op miSourceValidate 2019-10-30 16:26:01 +00:00
privates.c dix: Fix undefined memset in _dixInitScreenPrivates 2019-10-15 14:06:50 -04:00
property.c
protocol.txt
ptrveloc.c
region.c assert(a && b) --> assert(a); assert(b) 2019-05-02 15:02:36 -07:00
registry.c
resource.c dix: Fix undefined shift in HashResourceID 2019-10-15 14:06:21 -04:00
selection.c
stubmain.c
swaprep.c
swapreq.c
tables.c
touch.c
window.c dix: Remove WindowRec::backStorage 2019-04-12 21:53:03 +00:00