[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kwayland] /: [client] Fix nullptr dereference in ConfinedPointer and LockedPointer
From:       Martin_Gräßlin <mgraesslin () kde ! org>
Date:       2016-11-25 12:16:22
Message-ID: E1cAFQU-0005q3-7E () code ! kde ! org
[Download RAW message or body]

Git commit 4d0fa16741b372bdf262a55bc8e42525cf0f291b by Martin Gräßlin.
Committed on 25/11/2016 at 12:14.
Pushed by graesslin into branch 'master'.

[client] Fix nullptr dereference in ConfinedPointer and LockedPointer

The setRegion call allows a null region. This means nullptr is an
allowed value which can be passed to ConfinedPointer::setRegion and
LockedPointer::setRegion.

In that case we crash if we try to convert the Region into a wl_region.
Thus add proper nullptr check, just like in
PointerConstraints::lockPointer and ::confinePointer.

Auto test adjusted to cover the condition.

M  +10   -0    autotests/client/test_pointer_constraints.cpp
M  +10   -2    src/client/pointerconstraints.cpp

https://commits.kde.org/kwayland/4d0fa16741b372bdf262a55bc8e42525cf0f291b

diff --git a/autotests/client/test_pointer_constraints.cpp \
b/autotests/client/test_pointer_constraints.cpp index d2f2e75..5c7be6b 100644
--- a/autotests/client/test_pointer_constraints.cpp
+++ b/autotests/client/test_pointer_constraints.cpp
@@ -226,6 +226,11 @@ void TestPointerConstraints::testLockPointer()
     surface->commit(Surface::CommitFlag::None);
     QVERIFY(regionChangedSpy.wait());
     QCOMPARE(serverLockedPointer->region(), QRegion(0, 5, 10, 20));
+    // and unset region again
+    lockedPointer->setRegion(nullptr);
+    surface->commit(Surface::CommitFlag::None);
+    QVERIFY(regionChangedSpy.wait());
+    QCOMPARE(serverLockedPointer->region(), QRegion());
 
     // let's lock the surface
     QSignalSpy lockedChangedSpy(serverLockedPointer.data(), \
&LockedPointerInterface::lockedChanged); @@ -326,6 +331,11 @@ void \
TestPointerConstraints::testConfinePointer()  \
surface->commit(Surface::CommitFlag::None);  QVERIFY(regionChangedSpy.wait());
     QCOMPARE(serverConfinedPointer->region(), QRegion(0, 5, 10, 20));
+    // and unset region again
+    confinedPointer->setRegion(nullptr);
+    surface->commit(Surface::CommitFlag::None);
+    QVERIFY(regionChangedSpy.wait());
+    QCOMPARE(serverConfinedPointer->region(), QRegion());
 
     // let's confine the surface
     QSignalSpy confinedChangedSpy(serverConfinedPointer.data(), \
                &ConfinedPointerInterface::confinedChanged);
diff --git a/src/client/pointerconstraints.cpp b/src/client/pointerconstraints.cpp
index f1adc2b..2444df4 100644
--- a/src/client/pointerconstraints.cpp
+++ b/src/client/pointerconstraints.cpp
@@ -253,7 +253,11 @@ void LockedPointer::setCursorPositionHint(const QPointF \
&surfaceLocal)  void LockedPointer::setRegion(Region *region)
 {
     Q_ASSERT(isValid());
-    zwp_locked_pointer_v1_set_region(d->lockedpointer, *region);
+    wl_region *wr = nullptr;
+    if (region) {
+        wr = *region;
+    }
+    zwp_locked_pointer_v1_set_region(d->lockedpointer, wr);
 }
 
 class ConfinedPointer::Private
@@ -349,7 +353,11 @@ bool ConfinedPointer::isValid() const
 void ConfinedPointer::setRegion(Region *region)
 {
     Q_ASSERT(isValid());
-    zwp_confined_pointer_v1_set_region(d->confinedpointer, *region);
+    wl_region *wr = nullptr;
+    if (region) {
+        wr = *region;
+    }
+    zwp_confined_pointer_v1_set_region(d->confinedpointer, wr);
 }
 
 }


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic