From 48f864a5f455da6f22c27f79a138ff909db64da6 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Tue, 22 Aug 2023 11:13:11 +0700 Subject: [PATCH] fix possible crashes in case QCursor is used when qt_x11Data is null Signed-off-by: Ivailo Monev --- src/gui/kernel/qcursor_x11.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/gui/kernel/qcursor_x11.cpp b/src/gui/kernel/qcursor_x11.cpp index 0b329c17c..d05ca4cd1 100644 --- a/src/gui/kernel/qcursor_x11.cpp +++ b/src/gui/kernel/qcursor_x11.cpp @@ -114,7 +114,7 @@ Qt::HANDLE QCursor::handle() const return 0; } - Display *dpy = qt_x11Data->display; + Display *dpy = (qt_x11Data ? qt_x11Data->display : nullptr); if (!dpy) { return 0; } @@ -185,11 +185,14 @@ Qt::HANDLE QCursor::handle() const */ int QCursor::x11Screen() { + Display *dpy = (qt_x11Data ? qt_x11Data->display : nullptr); + if (!dpy) { + return -1; + } Window root; Window child; int root_x, root_y, win_x, win_y; uint buttons; - Display* dpy = qt_x11Data->display; for (int i = 0; i < ScreenCount(dpy); ++i) { if (XQueryPointer(dpy, QX11Info::appRootWindow(i), &root, &child, &root_x, &root_y, &win_x, &win_y, &buttons)) { @@ -202,11 +205,14 @@ int QCursor::x11Screen() QPoint QCursor::pos() { + Display *dpy = (qt_x11Data ? qt_x11Data->display : nullptr); + if (!dpy) { + return QPoint(); + } Window root; Window child; int root_x, root_y, win_x, win_y; uint buttons; - Display* dpy = qt_x11Data->display; for (int i = 0; i < ScreenCount(dpy); ++i) { if (XQueryPointer(dpy, QX11Info::appRootWindow(i), &root, &child, &root_x, &root_y, &win_x, &win_y, &buttons)) { @@ -218,18 +224,21 @@ QPoint QCursor::pos() void QCursor::setPos(int x, int y) { + Display *dpy = (qt_x11Data ? qt_x11Data->display : nullptr); + if (!dpy) { + return; + } + QPoint current; QPoint target(x, y); - // this is copied from pos(), since we need the screen number for the correct // root window in the XWarpPointer call Window root; Window child; int root_x, root_y, win_x, win_y; uint buttons; - Display* dpy = qt_x11Data->display; - int screen; - for (screen = 0; screen < ScreenCount(dpy); ++screen) { + int screen = 0; + for (; screen < ScreenCount(dpy); ++screen) { if (XQueryPointer(dpy, QX11Info::appRootWindow(screen), &root, &child, &root_x, &root_y, &win_x, &win_y, &buttons)) { current = QPoint(root_x, root_y); -- 2.11.0