summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/xcb
diff options
context:
space:
mode:
authorSamuel Rødal <samuel.rodal@nokia.com>2012-01-09 09:50:08 +0100
committerQt by Nokia <qt-info@nokia.com>2012-01-10 02:02:11 +0100
commit13c5c81cfa934c9b610720fe79e07465b00ebc8d (patch)
treed1e826f07e1f5a3cc11a3f7f9d5249769ec15e58 /src/plugins/platforms/xcb
parentb6a43cfe9c136e298feaa8d48fc252fdb3d4e7c5 (diff)
Lock X display while calling XESetWireToEvent and its callback.
Prevent potential race conditions as suggested by Uli Schlachter. Change-Id: Ia93eb8be1cbbc3d8ae7913a934c195af6b5ec538 Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com> Reviewed-by: Robin Burchell <robin+qt@viroteck.net> Reviewed-by: Uli Schlachter <psychon@znc.in>
Diffstat (limited to 'src/plugins/platforms/xcb')
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index ed995fd8cd..8501af15d3 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -570,13 +570,17 @@ void QXcbConnection::handleXcbEvent(xcb_generic_event_t *event)
if (!handled) {
// Check if a custom XEvent constructor was registered in xlib for this event type, and call it discarding the constructed XEvent if any.
// XESetWireToEvent might be used by libraries to intercept messages from the X server e.g. the OpenGL lib waiting for DRI2 events.
- Bool (*proc)(Display*, XEvent*, xEvent*) = XESetWireToEvent((Display*)m_xlib_display, response_type, 0);
+
+ Display *xdisplay = (Display *)m_xlib_display;
+ XLockDisplay(xdisplay);
+ Bool (*proc)(Display*, XEvent*, xEvent*) = XESetWireToEvent(xdisplay, response_type, 0);
if (proc) {
- XESetWireToEvent((Display*)m_xlib_display, response_type, proc);
+ XESetWireToEvent(xdisplay, response_type, proc);
XEvent dummy;
event->sequence = LastKnownRequestProcessed(m_xlib_display);
- proc((Display*)m_xlib_display, &dummy, (xEvent*)event);
+ proc(xdisplay, &dummy, (xEvent*)event);
}
+ XUnlockDisplay(xdisplay);
}
#endif