App crashing: Dispatch queue: com.apple.root.user-interactive-qos / vBoxConvolve...
authordino@apple.com <dino@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 28 Apr 2017 23:34:48 +0000 (23:34 +0000)
committerdino@apple.com <dino@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 28 Apr 2017 23:34:48 +0000 (23:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=171461
<rdar://problem/30534722>

Reviewed by Eric Carlson.

Source/WebCore:

We're getting reports of crashes in this function, caused by null or empty data being
passed to vImage. Guard against this, in a way that will ASSERT in debug builds if
anyone comes across it.

Test: css3/filters/blur-various-radii.html

* platform/graphics/filters/FEGaussianBlur.cpp:
(WebCore::accelerateBoxBlur): Return early if things don't look good.

LayoutTests:

Test a bunch of blurs a frame at a time.

* css3/filters/blur-various-radii-expected.html: Added.
* css3/filters/blur-various-radii.html: Added.

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

LayoutTests/ChangeLog
LayoutTests/css3/filters/blur-various-radii-expected.html [new file with mode: 0644]
LayoutTests/css3/filters/blur-various-radii.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp

index 1ee8419..43a12b1 100644 (file)
@@ -1,3 +1,16 @@
+2017-04-28  Dean Jackson  <dino@apple.com>
+
+        App crashing: Dispatch queue: com.apple.root.user-interactive-qos / vBoxConvolve / WebCore::FEGaussianBlur::platformApplySoftware()
+        https://bugs.webkit.org/show_bug.cgi?id=171461
+        <rdar://problem/30534722>
+
+        Reviewed by Eric Carlson.
+
+        Test a bunch of blurs a frame at a time.
+
+        * css3/filters/blur-various-radii-expected.html: Added.
+        * css3/filters/blur-various-radii.html: Added.
+
 2017-04-28  Chris Dumez  <cdumez@apple.com>
 
         Stop using legacy ClientRect / ClientRectList in Internals
diff --git a/LayoutTests/css3/filters/blur-various-radii-expected.html b/LayoutTests/css3/filters/blur-various-radii-expected.html
new file mode 100644 (file)
index 0000000..d6f3843
--- /dev/null
@@ -0,0 +1,64 @@
+<style>
+    .target1 {
+        background-color: rgba(0,0,0,0.25);
+    }
+    .target2 {
+        width: 0;
+        height: 0;
+    }
+    .target3 {
+        width: 80px;
+        height: 0;
+    }
+    .target4 {
+        width: 0;
+        height: 3px;
+    }
+    .target5 {
+        width: 1px;
+        height: 1px;
+    }
+</style>
+<script>
+    if (window.testRunner)
+        window.testRunner.waitUntilDone();
+
+    window.addEventListener("load", run, false);
+
+    const MAX_VALUE = 20;
+    const INCREMENT = 0.45;
+    let blurValue = -0.9;
+    let results;
+
+    function run() {
+        results = document.getElementById("results");
+
+        requestAnimationFrame(blur);
+    }
+
+    function blur() {
+        results.innerHTML += `Blurring ${blurValue}px<br>`;
+
+        blurValue += INCREMENT;
+        if (blurValue < MAX_VALUE)
+            requestAnimationFrame(blur);
+        else
+            requestAnimationFrame(finish);
+    }
+
+    function finish() {
+        if (window.testRunner)
+            window.testRunner.notifyDone();
+
+    }
+</script>
+<p class="target target1">
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+</p>
+<p class="target target2"></p>
+<p class="target target3"></p>
+<p class="target target4"></p>
+<p class="target target5"></p>
+<div id="results">
+</div>
diff --git a/LayoutTests/css3/filters/blur-various-radii.html b/LayoutTests/css3/filters/blur-various-radii.html
new file mode 100644 (file)
index 0000000..c5bcf1c
--- /dev/null
@@ -0,0 +1,69 @@
+<style>
+    .target1 {
+        background-color: rgba(0,0,0,0.25);
+    }
+    .target2 {
+        width: 0;
+        height: 0;
+    }
+    .target3 {
+        width: 80px;
+        height: 0;
+    }
+    .target4 {
+        width: 0;
+        height: 3px;
+    }
+    .target5 {
+        width: 1px;
+        height: 1px;
+    }
+</style>
+<script>
+    if (window.testRunner)
+        window.testRunner.waitUntilDone();
+
+    window.addEventListener("load", run, false);
+
+    const MAX_VALUE = 20;
+    const INCREMENT = 0.45;
+    let blurValue = -0.9;
+    let targets;
+    let results;
+
+    function run() {
+        targets = document.querySelectorAll(".target");
+        results = document.getElementById("results");
+
+        requestAnimationFrame(blur);
+    }
+
+    function blur() {
+        targets.forEach(obj => { obj.style.filter = `blur(${blurValue}px)` });
+        results.innerHTML += `Blurring ${blurValue}px<br>`;
+
+        blurValue += INCREMENT;
+        if (blurValue < MAX_VALUE)
+            requestAnimationFrame(blur);
+        else
+            requestAnimationFrame(finish);
+    }
+
+    function finish() {
+        targets.forEach(obj => { obj.style.filter = "none" });
+
+        if (window.testRunner)
+            window.testRunner.notifyDone();
+
+    }
+</script>
+<p class="target target1">
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+</p>
+<p class="target target2"></p>
+<p class="target target3"></p>
+<p class="target target4"></p>
+<p class="target target5"></p>
+<div id="results">
+</div>
index 80f2f38..a3368f9 100644 (file)
@@ -1,3 +1,20 @@
+2017-04-28  Dean Jackson  <dino@apple.com>
+
+        App crashing: Dispatch queue: com.apple.root.user-interactive-qos / vBoxConvolve / WebCore::FEGaussianBlur::platformApplySoftware()
+        https://bugs.webkit.org/show_bug.cgi?id=171461
+        <rdar://problem/30534722>
+
+        Reviewed by Eric Carlson.
+
+        We're getting reports of crashes in this function, caused by null or empty data being
+        passed to vImage. Guard against this, in a way that will ASSERT in debug builds if
+        anyone comes across it.
+
+        Test: css3/filters/blur-various-radii.html
+
+        * platform/graphics/filters/FEGaussianBlur.cpp:
+        (WebCore::accelerateBoxBlur): Return early if things don't look good.
+
 2017-04-28  Chris Dumez  <cdumez@apple.com>
 
         Stop using legacy ClientRect / ClientRectList in Internals
index fc39610..0b3b5ca 100644 (file)
@@ -298,6 +298,16 @@ inline void boxBlur(const Uint8ClampedArray* srcPixelArray, Uint8ClampedArray* d
 #if USE(ACCELERATE)
 inline void accelerateBoxBlur(const Uint8ClampedArray* src, Uint8ClampedArray* dst, unsigned kernelSize, int stride, int effectWidth, int effectHeight)
 {
+    if (!src || !src->data() || !dst || !dst->data()) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
+    if (effectWidth <= 0 || effectHeight <= 0 || stride <= 0) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
     // We must always use an odd radius.
     if (kernelSize % 2 != 1)
         kernelSize += 1;