diff options
author | Android Chromium Automerger <chromium-automerger@android> | 2014-03-28 17:54:29 +0000 |
---|---|---|
committer | Android Chromium Automerger <chromium-automerger@android> | 2014-03-28 17:54:29 +0000 |
commit | d35aa2de9366d53fcefd2de9fa450aafc7ac00e7 (patch) | |
tree | 60bc6bb95f8e1b34e602d92a268a30b3eb992d75 | |
parent | 19b3f44ac8cf5b107cabf33337f6232eac708fee (diff) | |
parent | 011a74db66c39c0d8cb6cb2fb6a62c38dd0e1fe0 (diff) | |
download | ots-d35aa2de9366d53fcefd2de9fa450aafc7ac00e7.tar.gz |
Merge third_party/ots from https://chromium.googlesource.com/external/ots.git at 011a74db66c39c0d8cb6cb2fb6a62c38dd0e1fe0
This commit was generated by merge_from_chromium.py.
Change-Id: Ifc8f21c2c580f0ba7ae986d6ab94635ffc402a7c
-rw-r--r-- | src/woff2.cc | 53 |
1 files changed, 20 insertions, 33 deletions
diff --git a/src/woff2.cc b/src/woff2.cc index 2ab0408..34d8b42 100644 --- a/src/woff2.cc +++ b/src/woff2.cc @@ -55,10 +55,6 @@ const uint32_t kCompressionTypeNone = 0; const uint32_t kCompressionTypeGzip = 1; const uint32_t kCompressionTypeBrotli = 2; -// This is a special value for the short format only, as described in -// "Design for compressed header format" in draft doc. -const uint32_t kShortFlagsContinue = 3; - const uint32_t kKnownTags[] = { TAG('c', 'm', 'a', 'p'), // 0 TAG('h', 'e', 'a', 'd'), // 1 @@ -769,7 +765,6 @@ bool Woff2Uncompress(uint8_t* dst_buf, size_t dst_size, bool ReadShortDirectory(ots::Buffer* file, std::vector<Table>* tables, size_t num_tables) { - uint32_t last_compression_type = 0; for (size_t i = 0; i < num_tables; ++i) { Table* table = &tables->at(i); uint8_t flag_byte; @@ -787,19 +782,15 @@ bool ReadShortDirectory(ots::Buffer* file, std::vector<Table>* tables, } tag = kKnownTags[flag_byte & 0x1f]; } - uint32_t flags = flag_byte >> 6; - if (flags == kShortFlagsContinue) { - flags = last_compression_type | kWoff2FlagsContinueStream; - } else { - if (flags == kCompressionTypeNone || - flags == kCompressionTypeGzip || - flags == kCompressionTypeBrotli) { - last_compression_type = flags; - } else { - return OTS_FAILURE(); - } + // Bits 5 and 6 are reserved and must be 0. + if ((flag_byte & 0x60) != 0) { + return OTS_FAILURE(); + } + uint32_t flags = kCompressionTypeBrotli; + if (i > 0) { + flags |= kWoff2FlagsContinueStream; } - if ((flag_byte & 0x20) != 0) { + if ((flag_byte & 0x80) != 0) { flags |= kWoff2FlagsTransform; } uint32_t dst_length; @@ -812,26 +803,13 @@ bool ReadShortDirectory(ots::Buffer* file, std::vector<Table>* tables, return OTS_FAILURE(); } } - uint32_t src_length = transform_length; - if ((flag_byte >> 6) == 1 || (flag_byte >> 6) == 2) { - if (!ReadBase128(file, &src_length)) { - return OTS_FAILURE(); - } - } else if (static_cast<uint32_t>(flag_byte >> 6) == kShortFlagsContinue) { - // The compressed data for this table is in a previuos table, so we set - // the src_length to zero. - src_length = 0; - } // Disallow huge numbers (> 1GB) for sanity. - if (src_length > 1024 * 1024 * 1024 || - transform_length > 1024 * 1024 * 1024 || + if (transform_length > 1024 * 1024 * 1024 || dst_length > 1024 * 1024 * 1024) { return OTS_FAILURE(); } - table->tag = tag; table->flags = flags; - table->src_length = src_length; table->transform_length = transform_length; table->dst_length = dst_length; } @@ -880,10 +858,18 @@ bool ConvertWOFF2ToTTF(uint8_t* result, size_t result_length, // We don't care about these fields of the header: // uint16_t reserved // uint32_t total_sfnt_size + if (!file.Skip(6)) { + return OTS_FAILURE(); + } + uint32_t compressed_length; + if (!file.ReadU32(&compressed_length)) { + return OTS_FAILURE(); + } + // We don't care about these fields of the header: // uint16_t major_version, minor_version // uint32_t meta_offset, meta_length, meta_orig_length // uint32_t priv_offset, priv_length - if (!file.Skip(30)) { + if (!file.Skip(24)) { return OTS_FAILURE(); } std::vector<Table> tables(num_tables); @@ -897,6 +883,7 @@ bool ConvertWOFF2ToTTF(uint8_t* result, size_t result_length, for (uint16_t i = 0; i < num_tables; ++i) { Table* table = &tables.at(i); table->src_offset = src_offset; + table->src_length = (i == 0 ? compressed_length : 0); src_offset += table->src_length; if (src_offset > std::numeric_limits<uint32_t>::max()) { return OTS_FAILURE(); @@ -983,7 +970,7 @@ bool ConvertWOFF2ToTTF(uint8_t* result, size_t result_length, } uncompressed_buf.resize(total_size); if (!Woff2Uncompress(&uncompressed_buf[0], total_size, - src_buf, table->src_length, compression_type)) { + src_buf, compressed_length, compression_type)) { return OTS_FAILURE(); } transform_buf = &uncompressed_buf[0]; |