Prevent NaN offset values in ElementTimeControl.
authorpdr@google.com <pdr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 27 Oct 2012 07:01:34 +0000 (07:01 +0000)
committerpdr@google.com <pdr@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 27 Oct 2012 07:01:34 +0000 (07:01 +0000)
https://bugs.webkit.org/show_bug.cgi?id=100322

Reviewed by Abhishek Arya.

Source/WebCore:

NaN values can cause ElementTimeControl to go back in time!
If a value of NaN is passed to ElementTimeControl::beginElementAt(offset),
subsequent sorting will cause an assert in SVGSMILElement::findInstanceTime
because NaN values are not properly sorted. NaN SMILTime values
should not be allowed at all, so this patch adds a check for them in
ElementTimeControl's setters.

This patch also adds preventative asserts to catch if SMILTime is ever
initialized with NaN, or if addEndTime/addBeginTime are ever called
with NaN values.

Test: svg/custom/elementTimeControl-nan-crash.html

* svg/SVGAnimationElement.cpp:
(WebCore::SVGAnimationElement::beginElementAt):
(WebCore::SVGAnimationElement::endElementAt):
* svg/animation/SMILTime.h:
(WebCore::SMILTime::SMILTime):
* svg/animation/SVGSMILElement.cpp:
(WebCore::SVGSMILElement::addBeginTime):
(WebCore::SVGSMILElement::addEndTime):

LayoutTests:

* svg/custom/elementTimeControl-nan-crash-expected.txt: Added.
* svg/custom/elementTimeControl-nan-crash.html: Added.

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

LayoutTests/ChangeLog
LayoutTests/svg/custom/elementTimeControl-nan-crash-expected.txt [new file with mode: 0644]
LayoutTests/svg/custom/elementTimeControl-nan-crash.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/svg/SVGAnimationElement.cpp
Source/WebCore/svg/animation/SMILTime.h
Source/WebCore/svg/animation/SVGSMILElement.cpp

index a7ef7e5..3eb03ab 100644 (file)
@@ -1,3 +1,13 @@
+2012-10-26  Philip Rogers  <pdr@google.com>
+
+        Prevent NaN offset values in ElementTimeControl.
+        https://bugs.webkit.org/show_bug.cgi?id=100322
+
+        Reviewed by Abhishek Arya.
+
+        * svg/custom/elementTimeControl-nan-crash-expected.txt: Added.
+        * svg/custom/elementTimeControl-nan-crash.html: Added.
+
 2012-10-26  Csaba Osztrogon√°c  <ossy@webkit.org>
 
         [Qt] Unreviewed weekend gardening, skip new failing tests.
diff --git a/LayoutTests/svg/custom/elementTimeControl-nan-crash-expected.txt b/LayoutTests/svg/custom/elementTimeControl-nan-crash-expected.txt
new file mode 100644 (file)
index 0000000..ef9a630
--- /dev/null
@@ -0,0 +1 @@
+Test for WK100322: ElementTimeControl should check for invalid values. This test passes if it does not crash.
diff --git a/LayoutTests/svg/custom/elementTimeControl-nan-crash.html b/LayoutTests/svg/custom/elementTimeControl-nan-crash.html
new file mode 100644 (file)
index 0000000..1d5e5d6
--- /dev/null
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+    function crash() {
+        var animate = document.getElementById('animate');
+        var svg = document.getElementById('svg');
+        animate.endElementAt(NaN);
+        animate.beginElementAt(NaN);
+        svg.setCurrentTime(2);
+        if (window.testRunner)
+            testRunner.dumpAsText();
+    }
+</script>
+</head>
+<body onload="crash()">
+Test for WK100322: ElementTimeControl should check for invalid values. This test passes if it does not crash.
+
+<svg id="svg" width="200" height="200">
+    <rect x="0" y="0" width="100" height="100" fill="green">
+        <animate id="animate" attributeName="x" to="200" begin="3s"/>
+    </rect>
+</svg>
+</body>
+</html>
index e8af02b..bf59673 100644 (file)
@@ -1,3 +1,32 @@
+2012-10-26  Philip Rogers  <pdr@google.com>
+
+        Prevent NaN offset values in ElementTimeControl.
+        https://bugs.webkit.org/show_bug.cgi?id=100322
+
+        Reviewed by Abhishek Arya.
+
+        NaN values can cause ElementTimeControl to go back in time!
+        If a value of NaN is passed to ElementTimeControl::beginElementAt(offset),
+        subsequent sorting will cause an assert in SVGSMILElement::findInstanceTime
+        because NaN values are not properly sorted. NaN SMILTime values
+        should not be allowed at all, so this patch adds a check for them in
+        ElementTimeControl's setters.
+        This patch also adds preventative asserts to catch if SMILTime is ever
+        initialized with NaN, or if addEndTime/addBeginTime are ever called
+        with NaN values.
+
+        Test: svg/custom/elementTimeControl-nan-crash.html
+
+        * svg/SVGAnimationElement.cpp:
+        (WebCore::SVGAnimationElement::beginElementAt):
+        (WebCore::SVGAnimationElement::endElementAt):
+        * svg/animation/SMILTime.h:
+        (WebCore::SMILTime::SMILTime):
+        * svg/animation/SVGSMILElement.cpp:
+        (WebCore::SVGSMILElement::addBeginTime):
+        (WebCore::SVGSMILElement::addEndTime):
+
 2012-10-26  Charles Wei  <charles.wei@torchmobile.com.cn>
 
         [BlackBerry] Browser prematurely sends wrong credentials
index bbaadbb..b63929b 100644 (file)
@@ -39,6 +39,7 @@
 #include "SVGNames.h"
 #include "SVGParserUtilities.h"
 #include "SVGStyledElement.h"
+#include <wtf/MathExtras.h>
 
 namespace WebCore {
 
@@ -240,6 +241,8 @@ void SVGAnimationElement::beginElement()
 
 void SVGAnimationElement::beginElementAt(float offset)
 {
+    if (isnan(offset))
+        return;
     SMILTime elapsed = this->elapsed();
     addBeginTime(elapsed, elapsed + offset, SMILTimeWithOrigin::ScriptOrigin);
 }
@@ -251,6 +254,8 @@ void SVGAnimationElement::endElement()
 
 void SVGAnimationElement::endElementAt(float offset)
 {
+    if (isnan(offset))
+        return;
     SMILTime elapsed = this->elapsed();
     addEndTime(elapsed, elapsed + offset, SMILTimeWithOrigin::ScriptOrigin);
 }
index 18abdae..dbc2d1f 100644 (file)
 #if ENABLE(SVG)
 
 #include <algorithm>
+#include <wtf/MathExtras.h>
 
 namespace WebCore {
 
 class SMILTime {
 public:
     SMILTime() : m_time(0) { }
-    SMILTime(double time) : m_time(time) { }
+    SMILTime(double time) : m_time(time) { ASSERT(!isnan(time)); }
     SMILTime(const SMILTime& o) : m_time(o.m_time) { }
     
     static SMILTime unresolved() { return unresolvedValue; }
index 878173b..c1ecb09 100644 (file)
@@ -713,6 +713,7 @@ SMILTime SVGSMILElement::simpleDuration() const
 
 void SVGSMILElement::addBeginTime(SMILTime eventTime, SMILTime beginTime, SMILTimeWithOrigin::Origin origin)
 {
+    ASSERT(!isnan(beginTime.value()));
     m_beginTimes.append(SMILTimeWithOrigin(beginTime, origin));
     sortTimeList(m_beginTimes);
     beginListChanged(eventTime);
@@ -720,6 +721,7 @@ void SVGSMILElement::addBeginTime(SMILTime eventTime, SMILTime beginTime, SMILTi
 
 void SVGSMILElement::addEndTime(SMILTime eventTime, SMILTime endTime, SMILTimeWithOrigin::Origin origin)
 {
+    ASSERT(!isnan(endTime.value()));
     m_endTimes.append(SMILTimeWithOrigin(endTime, origin));
     sortTimeList(m_endTimes);
     endListChanged(eventTime);