mirror of
https://gitlab.freedesktop.org/xorg/lib/libx11.git
synced 2026-05-26 20:38:21 +02:00
Close xcb connection after freeing display structure
Commit 1472048b7 to fix a colormap threading issue added a display
lock/unlock and a call to SyncHandle() to _XcmsFreeClientCmaps().
When running synchronized, that means calling XSync().
_XcmsFreeClientCmaps() is called from _XFreeDisplayStructure() via
XCloseDisplay() after the xcb connection is closed.
So when running synchronized, we may end up calling XSync() after the
xcb connection to the display is closed, which will generate a spurious
XIO error:
| #0 in _XDefaultIOError () at /lib64/libX11.so.6
| #1 in _XIOError () at /lib64/libX11.so.6
| #2 in _XReply () at /lib64/libX11.so.6
| #3 in XSync () at /lib64/libX11.so.6
| #4 in _XSyncFunction () at /lib64/libX11.so.6
| 8#5 in _XFreeDisplayStructure () at /lib64/libX11.so.6
| 8#6 in XCloseDisplay () at /lib64/libX11.so.6
To avoid that issue, closed the xcb connection to the display last.
v2: And same in OutOfMemory() as well (José Expósito)
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: José Expósito <jexposit@redhat.com>
Part-of: <https://gitlab.freedesktop.org/xorg/lib/libx11/-/merge_requests/264>
This commit is contained in:
parent
ed9fb5535e
commit
f3d6ebac35
2 changed files with 8 additions and 3 deletions
|
|
@ -47,6 +47,7 @@ XCloseDisplay (
|
|||
{
|
||||
register _XExtension *ext;
|
||||
register int i;
|
||||
xcb_connection_t *connection;
|
||||
|
||||
if (!(dpy->flags & XlibDisplayClosing))
|
||||
{
|
||||
|
|
@ -68,7 +69,8 @@ XCloseDisplay (
|
|||
if (X_DPY_GET_REQUEST(dpy) != X_DPY_GET_LAST_REQUEST_READ(dpy))
|
||||
XSync(dpy, 1);
|
||||
}
|
||||
xcb_disconnect(dpy->xcb->connection);
|
||||
connection = dpy->xcb->connection;
|
||||
_XFreeDisplayStructure (dpy);
|
||||
xcb_disconnect(connection);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -709,7 +709,10 @@ void _XFreeDisplayStructure(Display *dpy)
|
|||
|
||||
static void OutOfMemory(Display *dpy)
|
||||
{
|
||||
if(dpy->xcb->connection)
|
||||
xcb_disconnect(dpy->xcb->connection);
|
||||
xcb_connection_t *connection = dpy->xcb->connection;
|
||||
|
||||
_XFreeDisplayStructure (dpy);
|
||||
|
||||
if(connection)
|
||||
xcb_disconnect(connection);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue