Reviewed by Oliver
authorantti <antti@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 24 Aug 2007 19:38:57 +0000 (19:38 +0000)
committerantti <antti@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 24 Aug 2007 19:38:57 +0000 (19:38 +0000)
        Fix <rdar://problem/5393758>
        Crash in WebCore::FontData::platformInit

        Null check glyph page.

        If font has somehow failed to initialize it is possible to have null glyph page. Based on
        crash dumps this seems to occasionally happen when running Mail under guard malloc.

        No test case, I don't know how to get to this state.

        * platform/FontData.cpp:
        (WebCore::FontData::FontData):
        * platform/mac/FontDataMac.mm:
        (WebCore::FontData::platformInit):

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

WebCore/ChangeLog
WebCore/platform/FontData.cpp
WebCore/platform/mac/FontDataMac.mm

index 108d466f7619d5e5096963db4223540b27f1fddf..9496500af83bb798d5e70623baefcfb9e8fca1e8 100644 (file)
@@ -1,3 +1,22 @@
+2007-08-24  Antti Koivisto  <antti@apple.com>
+
+        Reviewed by Oliver
+
+        Fix <rdar://problem/5393758>
+        Crash in WebCore::FontData::platformInit
+        
+        Null check glyph page. 
+        
+        If font has somehow failed to initialize it is possible to have null glyph page. Based on
+        crash dumps this seems to occasionally happen when running Mail under guard malloc. 
+        
+        No test case, I don't know how to get to this state.
+
+        * platform/FontData.cpp:
+        (WebCore::FontData::FontData):
+        * platform/mac/FontDataMac.mm:
+        (WebCore::FontData::platformInit):
+
 2007-08-24  George Wright  <george.wright@collabora.co.uk>
 
         Reviewed by Oliver.
index cdfe93852ab50f88ca9b039a4444f8e326e4661f..0bc3ca204ab6dc57698b9a8ea2ce60bf7ae9f44b 100644 (file)
@@ -41,10 +41,21 @@ FontData::FontData(const FontPlatformData& f)
 {    
     platformInit();
     
+    GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->page();
+    if (!glyphPageZero) {
+        LOG_ERROR("Failed to get glyph page zero.");
+        m_spaceGlyph = 0;
+        m_spaceWidth = 0;
+        m_adjustedSpaceWidth = 0;
+        determinePitch();
+        m_missingGlyphData.fontData = this;
+        m_missingGlyphData.glyph = 0;
+        return;
+    }
     // Nasty hack to determine if we should round or ceil space widths.
     // If the font is monospace or fake monospace we ceil to ensure that 
     // every character and the space are the same width.  Otherwise we round.
-    m_spaceGlyph = GlyphPageTreeNode::getRootChild(this, 0)->page()->glyphDataForCharacter(' ').glyph;
+    m_spaceGlyph = glyphPageZero->glyphDataForCharacter(' ').glyph;
     float width = widthForGlyph(m_spaceGlyph);
     m_spaceWidth = width;
     determinePitch();
@@ -55,7 +66,7 @@ FontData::FontData(const FontPlatformData& f)
     // See <http://bugs.webkit.org/show_bug.cgi?id=13178>
     // Ask for the glyph for 0 to avoid paging in ZERO WIDTH SPACE. Control characters, including 0,
     // are mapped to the ZERO WIDTH SPACE glyph.
-    Glyph zeroWidthSpaceGlyph = GlyphPageTreeNode::getRootChild(this, 0)->page()->glyphDataForCharacter(0).glyph;
+    Glyph zeroWidthSpaceGlyph = glyphPageZero->glyphDataForCharacter(0).glyph;
     if (zeroWidthSpaceGlyph) {
         if (zeroWidthSpaceGlyph != m_spaceGlyph)
             m_glyphToWidthMap.setWidthForGlyph(zeroWidthSpaceGlyph, 0);
index 7c5b07c1a619fe71df506158ce18ac2b519680b3..534a97851969862947cfe3d73da0bdecf98839ef 100644 (file)
@@ -190,7 +190,8 @@ void FontData::platformInit()
     
     // Measure the actual character "x", because AppKit synthesizes X height rather than getting it from the font.
     // Unfortunately, NSFont will round this for us so we don't quite get the right value.
-    NSGlyph xGlyph = GlyphPageTreeNode::getRootChild(this, 0)->page()->glyphDataForCharacter('x').glyph;
+    GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->page();
+    NSGlyph xGlyph = glyphPageZero ? glyphPageZero->glyphDataForCharacter('x').glyph : 0;
     if (xGlyph) {
         NSRect xBox = [m_font.font() boundingRectForGlyph:xGlyph];
         // Use the maximum of either width or height because "x" is nearly square