REGRESSION(r240634): Element::hasPointerCapture() passes a JS-controlled value direct...
authorgraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Mar 2019 18:14:21 +0000 (18:14 +0000)
committergraouts@webkit.org <graouts@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 13 Mar 2019 18:14:21 +0000 (18:14 +0000)
https://bugs.webkit.org/show_bug.cgi?id=195683
<rdar://problem/48659950>

Reviewed by Alex Christensen.

Source/WebCore:

While PointerID is defined as int32_t, we now use int64_t as the key of the HashMap mapping PointerID to CapturingData so that we use
a value outside of the int32_t range as a safe empty and removed values, allowing any int32_t to be provided through the API for
lookup in this HashMap.

Test: pointerevents/pointer-id-crash.html

* page/PointerCaptureController.h:

LayoutTests:

Add a new test which would crash in debug builds prior to this fix.

* pointerevents/pointer-id-crash-expected.txt: Added.
* pointerevents/pointer-id-crash.html: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242893 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
Source/WebCore/ChangeLog
Source/WebCore/page/PointerCaptureController.h

index d0ba726..db82be6 100644 (file)
@@ -1,3 +1,16 @@
+2019-03-13  Antoine Quint  <graouts@apple.com>
+
+        REGRESSION(r240634): Element::hasPointerCapture() passes a JS-controlled value directly into a HashMap as a key
+        https://bugs.webkit.org/show_bug.cgi?id=195683
+        <rdar://problem/48659950>
+
+        Reviewed by Alex Christensen.
+
+        Add a new test which would crash in debug builds prior to this fix.
+
+        * pointerevents/pointer-id-crash-expected.txt: Added.
+        * pointerevents/pointer-id-crash.html: Added.
+
 2019-03-13  Shawn Roberts  <sroberts@apple.com>
 
         http/tests/websocket/tests/hybi/handshake-ok-with-legacy-sec-websocket-response-headers.html is a flaky failure on Mac WK2
index 6227c2e..a8356a4 100644 (file)
@@ -1,3 +1,19 @@
+2019-03-13  Antoine Quint  <graouts@apple.com>
+
+        REGRESSION(r240634): Element::hasPointerCapture() passes a JS-controlled value directly into a HashMap as a key
+        https://bugs.webkit.org/show_bug.cgi?id=195683
+        <rdar://problem/48659950>
+
+        Reviewed by Alex Christensen.
+
+        While PointerID is defined as int32_t, we now use int64_t as the key of the HashMap mapping PointerID to CapturingData so that we use
+        a value outside of the int32_t range as a safe empty and removed values, allowing any int32_t to be provided through the API for
+        lookup in this HashMap.
+
+        Test: pointerevents/pointer-id-crash.html
+
+        * page/PointerCaptureController.h:
+
 2019-03-12  Brady Eidson  <beidson@apple.com>
 
         Take UnboundedNetworking assertion when a file upload is in progress.
index b6184cb..173341d 100644 (file)
@@ -69,7 +69,10 @@ private:
     void processPendingPointerCapture(const PointerEvent&);
 
     Page& m_page;
-    HashMap<PointerID, CapturingData> m_activePointerIdsToCapturingData;
+    // While PointerID is defined as int32_t, we use int64_t here so that we may use a value outside of the int32_t range to have safe
+    // empty and removed values, allowing any int32_t to be provided through the API for lookup in this hashmap.
+    using PointerIdToCapturingDataMap = HashMap<int64_t, CapturingData, WTF::IntHash<int64_t>, WTF::SignedWithZeroKeyHashTraits<int64_t>>;
+    PointerIdToCapturingDataMap m_activePointerIdsToCapturingData;
 };
 
 } // namespace WebCore