2007-11-19 Doug Turner <dougt@meer.net>
authoralp@webkit.org <alp@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 20 Nov 2007 02:39:31 +0000 (02:39 +0000)
committeralp@webkit.org <alp@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 20 Nov 2007 02:39:31 +0000 (02:39 +0000)
        Reviewed by Alp Toker.

        http://bugs.webkit.org/show_bug.cgi?id=16054
        Crash when GlyphPage::fill is called with more than 256 bytes of data

        http://bugs.webkit.org/show_bug.cgi?id=14446
        [GDK] Crash on http://www.wikipedia.org/

        setGlyphDataForIndex() uses a fixed array of size 256 which we can't
        exceed. We need to return failure if the buffer has Unicode
        supplementary characters for now.

        This strategy matches the Win port, which also doesn't support this
        case yet.

        Add an assertion so nobody makes this mistake again.

        * platform/GlyphPageTreeNode.h:
        (WebCore::GlyphPage::setGlyphDataForIndex):
        * platform/gtk/GlyphPageTreeNodeGtk.cpp:
        (WebCore::GlyphPage::fill):

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

WebCore/ChangeLog
WebCore/platform/GlyphPageTreeNode.h
WebCore/platform/gtk/GlyphPageTreeNodeGtk.cpp

index bf840c84bf852aec5f69f8a2e7df35698d16a4a4..83a7a7e79dec4a913e90c26a756e9c502faf0499 100644 (file)
@@ -1,3 +1,27 @@
+2007-11-19  Doug Turner  <dougt@meer.net>
+
+        Reviewed by Alp Toker.
+
+        http://bugs.webkit.org/show_bug.cgi?id=16054
+        Crash when GlyphPage::fill is called with more than 256 bytes of data
+
+        http://bugs.webkit.org/show_bug.cgi?id=14446
+        [GDK] Crash on http://www.wikipedia.org/
+
+        setGlyphDataForIndex() uses a fixed array of size 256 which we can't
+        exceed. We need to return failure if the buffer has Unicode
+        supplementary characters for now.
+
+        This strategy matches the Win port, which also doesn't support this
+        case yet.
+
+        Add an assertion so nobody makes this mistake again.
+
+        * platform/GlyphPageTreeNode.h:
+        (WebCore::GlyphPage::setGlyphDataForIndex):
+        * platform/gtk/GlyphPageTreeNodeGtk.cpp:
+        (WebCore::GlyphPage::fill):
+
 2007-11-19  Doug Turner  <dougt@meer.net>
 
         Reviewed by Timothy Hatcher.
index c4750a0b66c07e271b17123877991273adbedbd5..c9037d4ee2a7adfc676b2a8a2e2257a31ef32649 100644 (file)
@@ -78,6 +78,7 @@ struct GlyphPage : public RefCounted<GlyphPage> {
     }
     void setGlyphDataForIndex(unsigned index, Glyph g, const FontData* f)
     {
+        ASSERT(index < size);
         m_glyphs[index].glyph = g;
         m_glyphs[index].fontData = f;
     }
index 47b6a93820dc5fac09a48e6f4c18a95dd7fad9b3..c0bcfa487915d2b1d44127b230f86d9849591ae7 100644 (file)
@@ -37,12 +37,17 @@ namespace WebCore {
 
 bool GlyphPage::fill(UChar* buffer, unsigned bufferLength, const FontData* fontData)
 {
+    // The bufferLength will be greater than the glyph page size if the buffer has Unicode supplementary characters.
+    // We won't support this for now.
+    if (bufferLength > GlyphPage::size)
+        return false;
+
     FT_Face face = cairo_ft_scaled_font_lock_face(fontData->m_font.m_scaledFont);
     if (!face)
         return false;
 
     bool haveGlyphs = false;
-    for (unsigned i = 0; i < bufferLength; i++) {
+    for (unsigned i = 0; i < GlyphPage::size; i++) {
         Glyph glyph = FcFreeTypeCharIndex(face, buffer[i]);
         if (!glyph)
             setGlyphDataForIndex(i, 0, 0);