Index: third_party/ots/src/woff2.cc |
diff --git a/third_party/ots/src/woff2.cc b/third_party/ots/src/woff2.cc |
index 5a795982fa3afbc079a7d89f0bbe4ce214154a83..b244aeca323fe8f866d0cf9d1dfc5c6b998f73bc 100644 |
--- a/third_party/ots/src/woff2.cc |
+++ b/third_party/ots/src/woff2.cc |
@@ -45,7 +45,7 @@ |
// Note that the byte order is big-endian, not the same as ots.cc |
#define TAG(a, b, c, d) ((a << 24) | (b << 16) | (c << 8) | d) |
-#define UNTAG(t) (t >> 24), (t >> 16), (t >> 8), (t >> 0) |
+#define CHR(t) (t >> 24), (t >> 16), (t >> 8), (t >> 0) |
const unsigned int kWoff2FlagsTransform = 1 << 5; |
@@ -772,6 +772,17 @@ |
return true; |
} |
+bool Woff2Uncompress(uint8_t* dst_buf, size_t dst_size, |
+ const uint8_t* src_buf, size_t src_size) { |
+ size_t uncompressed_size = dst_size; |
+ int ok = BrotliDecompressBuffer(src_size, src_buf, |
+ &uncompressed_size, dst_buf); |
+ if (!ok || uncompressed_size != dst_size) { |
+ return OTS_FAILURE(); |
+ } |
+ return true; |
+} |
+ |
bool ReadTableDirectory(ots::OpenTypeFile* file, |
ots::Buffer* buffer, std::vector<Table>* tables, |
size_t num_tables) { |
@@ -801,16 +812,12 @@ |
} |
uint32_t dst_length; |
if (!ReadBase128(buffer, &dst_length)) { |
- return OTS_FAILURE_MSG("Failed to read 'origLength' for table '%c%c%c%c'", UNTAG(tag)); |
+ return OTS_FAILURE_MSG("Failed to read 'origLength' for table '%c%c%c%c'", CHR(tag)); |
} |
uint32_t transform_length = dst_length; |
if ((flags & kWoff2FlagsTransform) != 0) { |
if (!ReadBase128(buffer, &transform_length)) { |
- return OTS_FAILURE_MSG("Failed to read 'transformLength' for table '%c%c%c%c'", UNTAG(tag)); |
- } |
- |
- if (tag == TAG('l', 'o', 'c', 'a') && transform_length != 0) { |
- return OTS_FAILURE_MSG("The 'transformLength' of 'loca' table must be zero: %d", transform_length); |
+ return OTS_FAILURE_MSG("Failed to read 'transformLength' for table '%c%c%c%c'", CHR(tag)); |
} |
} |
// Disallow huge numbers (> 1GB) for sanity. |
@@ -1013,15 +1020,12 @@ |
if (total_size > 30 * 1024 * 1024) { |
return OTS_FAILURE(); |
} |
- size_t uncompressed_size = static_cast<size_t>(total_size); |
- uncompressed_buf.resize(uncompressed_size); |
- const uint8_t* compressed_buf = data + compressed_offset; |
- if (!BrotliDecompressBuffer(compressed_length, compressed_buf, |
- &uncompressed_size, &uncompressed_buf[0])) { |
+ const size_t total_size_size_t = static_cast<size_t>(total_size); |
+ uncompressed_buf.resize(total_size_size_t); |
+ const uint8_t* src_buf = data + compressed_offset; |
+ if (!Woff2Uncompress(&uncompressed_buf[0], total_size_size_t, |
+ src_buf, compressed_length)) { |
return OTS_FAILURE_MSG("Failed to uncompress font data"); |
- } |
- if (uncompressed_size != static_cast<size_t>(total_size)) { |
- return OTS_FAILURE_MSG("Decompressed font data size does not match the sum of 'origLength' and 'transformLength'"); |
} |
transform_buf = &uncompressed_buf[0]; |
@@ -1043,7 +1047,7 @@ |
} else { |
if (!ReconstructTransformed(file, tables, table->tag, |
transform_buf, transform_length, result, result_length)) { |
- return OTS_FAILURE_MSG("Failed to reconstruct '%c%c%c%c' table", UNTAG(table->tag)); |
+ return OTS_FAILURE_MSG("Failed to reconstruct '%c%c%c%c' table", CHR(table->tag)); |
} |
} |