Protect global variable g_pointIdMap with mutexes
The evdev touch handler is thread based and calls QWindowSystemInterface::handleTouchEvent. The global variable in qwindowsysteminterface.cpp is used without being protected by mutexes which causes data loss and crashes when multiple touch screens are used. Fixes: QTBUG-63584 Change-Id: I8b5bb04cc517fab96ac428b2bd2bc128b2ca1a54 Reviewed-by: Johan Helsing <johan.helsing@qt.io> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>bb10
parent
c54083ff93
commit
23d7320852
|
|
@ -617,6 +617,7 @@ bool QWindowSystemInterface::isTouchDeviceRegistered(const QTouchDevice *device)
|
|||
static int g_nextPointId = 1;
|
||||
|
||||
// map from device-independent point id (arbitrary) to "Qt point" ids
|
||||
QMutex QWindowSystemInterfacePrivate::pointIdMapMutex;
|
||||
typedef QMap<quint64, int> PointIdMap;
|
||||
Q_GLOBAL_STATIC(PointIdMap, g_pointIdMap)
|
||||
|
||||
|
|
@ -634,6 +635,8 @@ Q_GLOBAL_STATIC(PointIdMap, g_pointIdMap)
|
|||
*/
|
||||
static int acquireCombinedPointId(quint8 deviceId, int pointId)
|
||||
{
|
||||
QMutexLocker locker(&QWindowSystemInterfacePrivate::pointIdMapMutex);
|
||||
|
||||
quint64 combinedId64 = (quint64(deviceId) << 32) + pointId;
|
||||
auto it = g_pointIdMap->constFind(combinedId64);
|
||||
int uid;
|
||||
|
|
@ -693,6 +696,8 @@ QList<QTouchEvent::TouchPoint>
|
|||
}
|
||||
|
||||
if (states == Qt::TouchPointReleased) {
|
||||
QMutexLocker locker(&QWindowSystemInterfacePrivate::pointIdMapMutex);
|
||||
|
||||
// All points on deviceId have been released.
|
||||
// Remove all points associated with that device from g_pointIdMap.
|
||||
// (On other devices, some touchpoints might still be pressed.
|
||||
|
|
@ -712,6 +717,7 @@ QList<QTouchEvent::TouchPoint>
|
|||
|
||||
void QWindowSystemInterfacePrivate::clearPointIdMap()
|
||||
{
|
||||
QMutexLocker locker(&QWindowSystemInterfacePrivate::pointIdMapMutex);
|
||||
g_pointIdMap->clear();
|
||||
g_nextPointId = 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -528,6 +528,7 @@ public:
|
|||
|
||||
static QWaitCondition eventsFlushed;
|
||||
static QMutex flushEventMutex;
|
||||
static QMutex pointIdMapMutex;
|
||||
static QAtomicInt eventAccepted;
|
||||
|
||||
static QList<QTouchEvent::TouchPoint>
|
||||
|
|
|
|||
Loading…
Reference in New Issue