From 03e76ac23d3f9892c5853cab8760ca46c9117229 Mon Sep 17 00:00:00 2001 From: Nils Jeisecke Date: Mon, 20 Jun 2022 12:42:06 +0200 Subject: xcb: fix missing initialization of m_cursor Regression introduced in 9a4c98e55659b32db984612e6247ac193812a502: m_cursor is not initialized and never set when monitorInfo is not available in QXcbScreen::setMonitor. This seems to happen when running in VNC, e.g. on a Raspberry Pi. This usually results in crashing the application pretty soon. Using a unique_ptr solves both the initialization and a possible leak when setMonitor is called multiple times. [ChangeLog][Linux/XCB] Fixed crash when no monitorInfo is available (e.g. VNC). Fixes: QTBUG-104443 Pick-to: 6.3 6.4 Change-Id: If13493c177121a1994b5d00dfbd64f1da694df2e Reviewed-by: Liang Qi --- src/plugins/platforms/xcb/qxcbscreen.cpp | 9 +++------ src/plugins/platforms/xcb/qxcbscreen.h | 4 +++- 2 files changed, 6 insertions(+), 7 deletions(-) (limited to 'src/plugins/platforms/xcb') diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp index bb33f393ec..36c5cd0d78 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.cpp +++ b/src/plugins/platforms/xcb/qxcbscreen.cpp @@ -499,6 +499,7 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDe , m_crtc(output ? output->crtc : XCB_NONE) , m_outputName(getOutputName(output)) , m_outputSizeMillimeters(output ? QSize(output->mm_width, output->mm_height) : QSize()) + , m_cursor(std::make_unique(connection, this)) { if (connection->isAtLeastXRandR12()) { xcb_randr_select_input(xcb_connection(), screen()->root, true); @@ -519,8 +520,6 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDe if (m_sizeMillimeters.isEmpty()) m_sizeMillimeters = virtualDesktop->physicalSize(); - m_cursor = new QXcbCursor(connection, this); - updateColorSpaceAndEdid(); } @@ -585,6 +584,7 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDe : QXcbObject(connection) , m_virtualDesktop(virtualDesktop) , m_monitor(monitorInfo) + , m_cursor(std::make_unique(connection, this)) { setMonitor(monitorInfo, timestamp); } @@ -683,8 +683,6 @@ void QXcbScreen::setMonitor(xcb_randr_monitor_info_t *monitorInfo, xcb_timestamp else m_primary = false; - m_cursor = new QXcbCursor(connection(), this); - updateColorSpaceAndEdid(); } @@ -702,7 +700,6 @@ QString QXcbScreen::defaultName() QXcbScreen::~QXcbScreen() { - delete m_cursor; } QString QXcbScreen::getOutputName(xcb_randr_get_output_info_reply_t *outputInfo) @@ -869,7 +866,7 @@ QDpi QXcbScreen::logicalDpi() const QPlatformCursor *QXcbScreen::cursor() const { - return m_cursor; + return m_cursor.get(); } void QXcbScreen::setOutput(xcb_randr_output_t outputId, diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h index 12c13ef80e..5a844f944a 100644 --- a/src/plugins/platforms/xcb/qxcbscreen.h +++ b/src/plugins/platforms/xcb/qxcbscreen.h @@ -18,6 +18,8 @@ #include +#include + QT_BEGIN_NAMESPACE class QXcbConnection; @@ -212,7 +214,7 @@ private: QRect m_availableGeometry; QColorSpace m_colorSpace; Qt::ScreenOrientation m_orientation = Qt::PrimaryOrientation; - QXcbCursor *m_cursor; + std::unique_ptr m_cursor; qreal m_refreshRate = 60.0; QEdidParser m_edid; -- cgit v1.2.3