Fix crash in QWindowPrivate::applyCursor when screen is null

QWindow::setVisible calls QWindowPrivate::applyCursor without checking
if screen() returns null. This patch adds a check in QWindowPrivate::applyCursor
that the screen is not null. Now that it is tested there, no need to test
it from the other caller (setCursor)
This patch should not change behavior of setCursor at all, it should only
fix the crash when coming from setVisible

Task-number: QTBUG-59528
Change-Id: I06bbdb4e04c02ac840ba637242d1f2cfde5bdd62
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
This commit is contained in:
Olivier Goffart 2017-03-16 10:04:01 +01:00 committed by Olivier Goffart (Woboq GmbH)
parent e364384d9f
commit 5cda0172e0
2 changed files with 11 additions and 8 deletions

View File

@ -2559,26 +2559,29 @@ void QWindowPrivate::setCursor(const QCursor *newCursor)
cursor = QCursor(Qt::ArrowCursor);
hasCursor = false;
}
// Only attempt to set cursor and emit signal if there is an actual platform cursor
QScreen* screen = q->screen();
if (screen && screen->handle()->cursor()) {
applyCursor();
// Only attempt to emit signal if there is an actual platform cursor
if (applyCursor()) {
QEvent event(QEvent::CursorChange);
QGuiApplication::sendEvent(q, &event);
}
}
void QWindowPrivate::applyCursor()
// Apply the cursor and returns true iff the platform cursor exists
bool QWindowPrivate::applyCursor()
{
Q_Q(QWindow);
if (platformWindow) {
if (QPlatformCursor *platformCursor = q->screen()->handle()->cursor()) {
if (QScreen *screen = q->screen()) {
if (QPlatformCursor *platformCursor = screen->handle()->cursor()) {
if (!platformWindow)
return true;
QCursor *c = QGuiApplication::overrideCursor();
if (!c && hasCursor)
c = &cursor;
platformCursor->changeCursor(c, q);
return true;
}
}
return false;
}
#endif // QT_NO_CURSOR

View File

@ -118,7 +118,7 @@ public:
void maybeQuitOnLastWindowClosed();
#ifndef QT_NO_CURSOR
void setCursor(const QCursor *c = 0);
void applyCursor();
bool applyCursor();
#endif
void deliverUpdateRequest();