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:
Olivier Fourdan 2024-08-09 09:21:31 +02:00
parent ed9fb5535e
commit f3d6ebac35
2 changed files with 8 additions and 3 deletions

View file

@ -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;
}

View file

@ -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);
}