OSDN Git Service

Add defensive code for crash in FontPlatformData
authorRussell Brenner <russellbrenner@google.com>
Wed, 23 Mar 2011 21:36:13 +0000 (14:36 -0700)
committerRussell Brenner <russellbrenner@google.com>
Thu, 24 Mar 2011 00:06:37 +0000 (17:06 -0700)
bug: 4163318
In FontPlatformData, both 0 and -1 are used as special values for
mTypeface. Skia has checks to handle null typefaces, but -1 is a
special value (hashTableDeletedFontValue) unique to FontPlatformData.
The constructors and operators appear to have the necessary guards,
but setupPaint(), uniqueID(), and isFixedPitch() needed some touchup
to better handle 0 or -1.

There's still the question of whether or not it's appropriate to be
calling any of those functions with the typeface set to 0 or -1, so
these changes may simply be deflecting the underlying problem, but
these changes should guard against the immediate failure.

Change-Id: Ib68a64ba6d4eeffbd502f29b68074e38c511a746

WebCore/platform/graphics/android/FontPlatformDataAndroid.cpp

index 352516b..337a94d 100644 (file)
@@ -163,11 +163,15 @@ void FontPlatformData::setupPaint(SkPaint* paint) const
     if (!(ts > 0))
         ts = 12;
 
+    if (hashTableDeletedFontValue() == mTypeface)
+        paint->setTypeface(0);
+    else
+        paint->setTypeface(mTypeface);
+
     paint->setAntiAlias(true);
     paint->setSubpixelText(true);
     paint->setHinting(SkPaint::kSlight_Hinting);
     paint->setTextSize(SkFloatToScalar(ts));
-    paint->setTypeface(mTypeface);
     paint->setFakeBoldText(mFakeBold);
     paint->setTextSkewX(mFakeItalic ? -SK_Scalar1/4 : 0);
 #ifndef SUPPORT_COMPLEX_SCRIPTS
@@ -177,7 +181,10 @@ void FontPlatformData::setupPaint(SkPaint* paint) const
 
 uint32_t FontPlatformData::uniqueID() const
 {
-    return mTypeface->uniqueID();
+    if (hashTableDeletedFontValue() == mTypeface)
+        return SkTypeface::UniqueID(0);
+    else
+        return SkTypeface::UniqueID(mTypeface);
 }
 
 bool FontPlatformData::operator==(const FontPlatformData& a) const
@@ -207,7 +214,10 @@ unsigned FontPlatformData::hash() const
 
 bool FontPlatformData::isFixedPitch() const
 {
-    return mTypeface ? mTypeface->isFixedWidth() : false;
+    if (mTypeface && (mTypeface != hashTableDeletedFontValue()))
+        return mTypeface->isFixedWidth();
+    else
+        return false;
 }
 
 HB_FaceRec_* FontPlatformData::harfbuzzFace() const