Index: third_party/woff2/src/font.cc |
diff --git a/third_party/woff2/src/font.cc b/third_party/woff2/src/font.cc |
index 3679a4c0d3b831cdbad175985670204bcdb4ccae..fc496e05931af197a4b358b67ac2d08a579d20db 100644 |
--- a/third_party/woff2/src/font.cc |
+++ b/third_party/woff2/src/font.cc |
@@ -105,6 +105,12 @@ bool ReadTrueTypeFont(Buffer* file, const uint8_t* data, size_t len, |
last_offset = i.first + i.second; |
} |
+ // Sanity check key tables |
+ const Font::Table* head_table = font->FindTable(kHeadTableTag); |
+ if (head_table != NULL && head_table->length < 52) { |
+ return FONT_COMPRESSION_FAILURE(); |
+ } |
+ |
return true; |
} |
@@ -181,15 +187,14 @@ bool ReadFontCollection(const uint8_t* data, size_t len, |
FontCollection* font_collection) { |
Buffer file(data, len); |
- uint32_t flavor; |
- if (!file.ReadU32(&flavor)) { |
+ if (!file.ReadU32(&font_collection->flavor)) { |
return FONT_COMPRESSION_FAILURE(); |
} |
- if (flavor != kTtcFontFlavor) { |
+ if (font_collection->flavor != kTtcFontFlavor) { |
font_collection->fonts.resize(1); |
Font& font = font_collection->fonts[0]; |
- font.flavor = flavor; |
+ font.flavor = font_collection->flavor; |
return ReadTrueTypeFont(&file, data, len, &font); |
} |
return ReadTrueTypeCollection(&file, data, len, font_collection); |
@@ -286,7 +291,7 @@ bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst, |
size_t offset = 0; |
// It's simpler if this just a simple sfnt |
- if (font_collection.fonts.size() == 1) { |
+ if (font_collection.flavor != kTtcFontFlavor) { |
return WriteFont(font_collection.fonts[0], &offset, dst, dst_size); |
} |