[Template] Avoid reading beyond the end of the buffer in preload scanner when check...
authorrafaelw@chromium.org <rafaelw@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Jan 2013 00:06:54 +0000 (00:06 +0000)
committerrafaelw@chromium.org <rafaelw@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 18 Jan 2013 00:06:54 +0000 (00:06 +0000)
https://bugs.webkit.org/show_bug.cgi?id=107143

Reviewed by Adam Barth.

This patch corrects to use AtomicString constructor which takes an explicit size. Additionally, the logic
for exiting early is slightly improved.

No new tests.

* html/parser/HTMLPreloadScanner.cpp:
(WebCore::PreloadTask::PreloadTask):
(WebCore::HTMLPreloadScanner::processToken):

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

Source/WebCore/ChangeLog
Source/WebCore/html/parser/HTMLPreloadScanner.cpp

index b5df029..90aa12a 100644 (file)
@@ -1,3 +1,19 @@
+2013-01-17  Rafael Weinstein  <rafaelw@chromium.org>
+
+        [Template] Avoid reading beyond the end of the buffer in preload scanner when check for </template>
+        https://bugs.webkit.org/show_bug.cgi?id=107143
+
+        Reviewed by Adam Barth.
+
+        This patch corrects to use AtomicString constructor which takes an explicit size. Additionally, the logic
+        for exiting early is slightly improved.
+
+        No new tests.
+
+        * html/parser/HTMLPreloadScanner.cpp:
+        (WebCore::PreloadTask::PreloadTask):
+        (WebCore::HTMLPreloadScanner::processToken):
+
 2013-01-17  Huang Dongsung  <luxtella@company100.net>
 
         [TexMap] Match initializing members in GraphicsLayerTransform to initializing members in GraphicsLayer.
 2013-01-17  Huang Dongsung  <luxtella@company100.net>
 
         [TexMap] Match initializing members in GraphicsLayerTransform to initializing members in GraphicsLayer.
index 2356b8e..ec7e7d2 100644 (file)
@@ -46,13 +46,13 @@ using namespace HTMLNames;
 
 class PreloadTask {
 public:
 
 class PreloadTask {
 public:
-    explicit PreloadTask(const HTMLToken& token)
-        : m_tagName(token.name().data(), token.name().size())
+    explicit PreloadTask(const AtomicString& tagName, const HTMLToken::AttributeList& attributes)
+        : m_tagName(tagName)
         , m_linkIsStyleSheet(false)
         , m_linkMediaAttributeIsScreen(true)
         , m_inputIsImage(false)
     {
         , m_linkIsStyleSheet(false)
         , m_linkMediaAttributeIsScreen(true)
         , m_inputIsImage(false)
     {
-        processAttributes(token.attributes());
+        processAttributes(attributes);
     }
 
     void processAttributes(const HTMLToken::AttributeList& attributes)
     }
 
     void processAttributes(const HTMLToken::AttributeList& attributes)
@@ -204,35 +204,32 @@ void HTMLPreloadScanner::processToken()
 
     if (m_token.type() != HTMLTokenTypes::StartTag) {
 #if ENABLE(TEMPLATE_ELEMENT)
 
     if (m_token.type() != HTMLTokenTypes::StartTag) {
 #if ENABLE(TEMPLATE_ELEMENT)
-        if (m_templateCount && m_token.type() == HTMLTokenTypes::EndTag && AtomicString(m_token.name().data()) == templateTag)
+        if (m_templateCount && m_token.type() == HTMLTokenTypes::EndTag && AtomicString(m_token.name().data(), m_token.name().size()) == templateTag)
             m_templateCount--;
 #endif
         return;
     }
 
             m_templateCount--;
 #endif
         return;
     }
 
-    PreloadTask task(m_token);
-    m_tokenizer->updateStateFor(task.tagName());
+    AtomicString tagName(m_token.name().data(), m_token.name().size());
 
 #if ENABLE(TEMPLATE_ELEMENT)
 
 #if ENABLE(TEMPLATE_ELEMENT)
-    if (task.tagName() == templateTag)
+    if (tagName == templateTag)
         m_templateCount++;
         m_templateCount++;
+
+    if (m_templateCount)
+        return;
 #endif
 
 #endif
 
+    PreloadTask task(tagName, m_token.attributes());
+    m_tokenizer->updateStateFor(task.tagName());
+
     if (task.tagName() == styleTag)
         m_inStyle = true;
 
     if (task.tagName() == baseTag)
         updatePredictedBaseElementURL(KURL(m_document->url(), task.baseElementHref()));
 
     if (task.tagName() == styleTag)
         m_inStyle = true;
 
     if (task.tagName() == baseTag)
         updatePredictedBaseElementURL(KURL(m_document->url(), task.baseElementHref()));
 
-    bool preload = true;
-
-#if ENABLE(TEMPLATE_ELEMENT)
-    if (m_templateCount)
-        preload = false;
-#endif
-
-    if (preload)
-        task.preload(m_document, m_predictedBaseElementURL.isEmpty() ? m_document->baseURL() : m_predictedBaseElementURL);
+    task.preload(m_document, m_predictedBaseElementURL.isEmpty() ? m_document->baseURL() : m_predictedBaseElementURL);
 }
 
 void HTMLPreloadScanner::updatePredictedBaseElementURL(const KURL& baseElementURL)
 }
 
 void HTMLPreloadScanner::updatePredictedBaseElementURL(const KURL& baseElementURL)