Index: third_party/ots/src/ots.cc |
diff --git a/third_party/ots/src/ots.cc b/third_party/ots/src/ots.cc |
index 197c649816528cc5a5b9a48485219aa6d424b36e..5ba8dd94c4625a18b89aeb7c78bfdcf2c7768445 100644 |
--- a/third_party/ots/src/ots.cc |
+++ b/third_party/ots/src/ots.cc |
@@ -284,7 +284,7 @@ bool ProcessWOFF(ots::OpenTypeFile *header, |
// We don't care about these fields of the header: |
// uint16_t major_version, minor_version |
if (!file.Skip(2 * 2)) { |
- return OTS_FAILURE_MSG_HDR("error skipping WOFF header fields"); |
+ return OTS_FAILURE_MSG_HDR("Failed to read 'majorVersion' or 'minorVersion'"); |
} |
// Checks metadata block size. |
@@ -294,11 +294,11 @@ bool ProcessWOFF(ots::OpenTypeFile *header, |
if (!file.ReadU32(&meta_offset) || |
!file.ReadU32(&meta_length) || |
!file.ReadU32(&meta_length_orig)) { |
- return OTS_FAILURE_MSG_HDR("error reading WOFF header fields"); |
+ return OTS_FAILURE_MSG_HDR("Failed to read header metadata block fields"); |
} |
if (meta_offset) { |
if (meta_offset >= length || length - meta_offset < meta_length) { |
- return OTS_FAILURE_MSG_HDR("invalid metadata block location/size"); |
+ return OTS_FAILURE_MSG_HDR("Invalid metadata block offset or length"); |
} |
} |
@@ -307,11 +307,11 @@ bool ProcessWOFF(ots::OpenTypeFile *header, |
uint32_t priv_length; |
if (!file.ReadU32(&priv_offset) || |
!file.ReadU32(&priv_length)) { |
- return OTS_FAILURE_MSG_HDR("error reading WOFF header fields"); |
+ return OTS_FAILURE_MSG_HDR("Failed to read header private block fields"); |
} |
if (priv_offset) { |
if (priv_offset >= length || length - priv_offset < priv_length) { |
- return OTS_FAILURE_MSG_HDR("invalid private block location/size"); |
+ return OTS_FAILURE_MSG_HDR("Invalid private block offset or length"); |
} |
} |
@@ -366,26 +366,26 @@ bool ProcessWOFF(ots::OpenTypeFile *header, |
} |
if (meta_offset) { |
if (block_end != meta_offset) { |
- return OTS_FAILURE_MSG_HDR("invalid metadata block location"); |
+ return OTS_FAILURE_MSG_HDR("Invalid metadata block offset"); |
} |
block_end = ots::Round4(static_cast<uint64_t>(meta_offset) + |
static_cast<uint64_t>(meta_length)); |
if (block_end > std::numeric_limits<uint32_t>::max()) { |
- return OTS_FAILURE_MSG_HDR("invalid metadata block size"); |
+ return OTS_FAILURE_MSG_HDR("Invalid metadata block length"); |
} |
} |
if (priv_offset) { |
if (block_end != priv_offset) { |
- return OTS_FAILURE_MSG_HDR("invalid private block location"); |
+ return OTS_FAILURE_MSG_HDR("Invalid private block offset"); |
} |
block_end = ots::Round4(static_cast<uint64_t>(priv_offset) + |
static_cast<uint64_t>(priv_length)); |
if (block_end > std::numeric_limits<uint32_t>::max()) { |
- return OTS_FAILURE_MSG_HDR("invalid private block size"); |
+ return OTS_FAILURE_MSG_HDR("Invalid private block length"); |
} |
} |
if (block_end != ots::Round4(length)) { |
- return OTS_FAILURE_MSG_HDR("file length mismatch (trailing junk?)"); |
+ return OTS_FAILURE_MSG_HDR("File length mismatch (trailing junk?)"); |
} |
return ProcessGeneric(header, woff_tag, output, data, length, tables, file); |
@@ -395,17 +395,17 @@ bool ProcessWOFF2(ots::OpenTypeFile *header, |
ots::OTSStream *output, const uint8_t *data, size_t length) { |
size_t decompressed_size = ots::ComputeWOFF2FinalSize(data, length); |
if (decompressed_size == 0) { |
- return OTS_FAILURE(); |
+ return OTS_FAILURE_MSG_HDR("Size of decompressed WOFF 2.0 is set to 0"); |
} |
// decompressed font must be <= 30MB |
if (decompressed_size > 30 * 1024 * 1024) { |
- return OTS_FAILURE(); |
+ return OTS_FAILURE_MSG_HDR("Size of decompressed WOFF 2.0 font exceeds 30MB"); |
} |
std::vector<uint8_t> decompressed_buffer(decompressed_size); |
- if (!ots::ConvertWOFF2ToTTF(header, &decompressed_buffer[0], decompressed_size, |
- data, length)) { |
- return OTS_FAILURE(); |
+ if (!ots::ConvertWOFF2ToSFNT(header, &decompressed_buffer[0], decompressed_size, |
+ data, length)) { |
+ return OTS_FAILURE_MSG_HDR("Failed to convert WOFF 2.0 font to SFNT"); |
} |
return ProcessTTF(header, output, &decompressed_buffer[0], decompressed_size); |
} |
@@ -599,8 +599,14 @@ bool ProcessGeneric(ots::OpenTypeFile *header, uint32_t signature, |
} else { |
if (!header->glyf || !header->loca) { |
// No TrueType glyph found. |
- // Note: bitmap-only fonts are not supported. |
- return OTS_FAILURE_MSG_HDR("neither PS nor TT glyphs present"); |
+#define PASSTHRU_TABLE(TAG) (table_map.find(Tag(TAG)) != table_map.end() && \ |
+ GetTableAction(header, Tag(TAG)) == ots::TABLE_ACTION_PASSTHRU) |
+ // We don't sanitise bitmap table, but don't reject bitmap-only fonts if |
+ // we keep the tables. |
+ if (!PASSTHRU_TABLE("CBDT") || !PASSTHRU_TABLE("CBLC")) { |
+ return OTS_FAILURE_MSG_HDR("no supported glyph shapes table(s) present"); |
+ } |
+#undef PASSTHRU_TABLE |
} |
} |
@@ -776,9 +782,6 @@ bool ProcessGeneric(ots::OpenTypeFile *header, uint32_t signature, |
namespace ots { |
-void EnableWOFF2() { |
-} |
- |
bool IsValidVersionTag(uint32_t tag) { |
return tag == Tag("\x00\x01\x00\x00") || |
// OpenType fonts with CFF data have 'OTTO' tag. |