aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Chromium Automerger <chromium-automerger@android>2014-03-28 17:54:29 +0000
committerAndroid Chromium Automerger <chromium-automerger@android>2014-03-28 17:54:29 +0000
commitd35aa2de9366d53fcefd2de9fa450aafc7ac00e7 (patch)
tree60bc6bb95f8e1b34e602d92a268a30b3eb992d75
parent19b3f44ac8cf5b107cabf33337f6232eac708fee (diff)
parent011a74db66c39c0d8cb6cb2fb6a62c38dd0e1fe0 (diff)
downloadots-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.cc53
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];