diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2017-07-26 23:17:52 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2017-07-26 23:17:52 +0000 |
commit | 75c8954e7f87b60d0856b0398c0993e55807e9f5 (patch) | |
tree | 94f8afcf7e2aa1a3ee48b61b60aa0eeb6cedbb41 | |
parent | 1aa0c40db9d3d308758fc836ac117a9b4e3723a5 (diff) | |
parent | cda9f2a67e8ae292d78b47f23ca04326d3a860c9 (diff) | |
download | minikin-nougat-mr1-volantis-release.tar.gz |
Merge cherrypicks of [2604297, 2604299, 2604519, 2606195, 2605695, 2604520, 2606196, 2604521, 2604522, 2606197, 2604523, 2605696, 2605697, 2605698, 2606198, 2604524, 2604525, 2604526, 2604300, 2604527, 2606199, 2604528, 2604529, 2604301, 2606200, 2604302, 2606410, 2606201, 2606411, 2606202, 2606413, 2606203, 2606414, 2604303, 2604304, 2606204, 2604305, 2606206, 2606207, 2604306, 2606415, 2606208, 2606209, 2606416] into nyc-mr1-volantis-releaseandroid-7.1.1_r58android-7.1.1_r53nougat-mr1-volantis-releasenougat-mr1-flounder-release
Change-Id: I704c7e2cde47abafbcdf9c4a989e65141df16c35
-rw-r--r-- | libs/minikin/CmapCoverage.cpp | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/libs/minikin/CmapCoverage.cpp b/libs/minikin/CmapCoverage.cpp index 2961d2f..c02526c 100644 --- a/libs/minikin/CmapCoverage.cpp +++ b/libs/minikin/CmapCoverage.cpp @@ -37,15 +37,25 @@ static uint32_t readU32(const uint8_t* data, size_t offset) { ((uint32_t)data[offset + 2]) << 8 | ((uint32_t)data[offset + 3]); } -static void addRange(vector<uint32_t> &coverage, uint32_t start, uint32_t end) { +// The start must be larger than or equal to coverage.back() if coverage is not empty. +// Returns true if the range is appended. Otherwise returns false as an error. +static bool addRange(vector<uint32_t> &coverage, uint32_t start, uint32_t end) { #ifdef VERBOSE_DEBUG ALOGD("adding range %d-%d\n", start, end); #endif if (coverage.empty() || coverage.back() < start) { coverage.push_back(start); coverage.push_back(end); - } else { + return true; + } else if (coverage.back() == start) { coverage.back() = end; + return true; + } else { + // Reject unordered range input since SparseBitSet assumes that the given range vector is + // sorted. OpenType specification says cmap entries are sorted in order of code point + // values, thus for OpenType compliant font files, we don't reach here. + android_errorWriteLog(0x534e4554, "32178311"); + return false; } } @@ -74,11 +84,15 @@ static bool getCoverageFormat4(vector<uint32_t>& coverage, const uint8_t* data, if (rangeOffset == 0) { uint32_t delta = readU16(data, kHeaderSize + 2 * (2 * segCount + i)); if (((end + delta) & 0xffff) > end - start) { - addRange(coverage, start, end + 1); + if (!addRange(coverage, start, end + 1)) { + return false; + } } else { for (uint32_t j = start; j < end + 1; j++) { if (((j + delta) & 0xffff) != 0) { - addRange(coverage, j, j + 1); + if (!addRange(coverage, j, j + 1)) { + return false; + } } } } @@ -92,7 +106,9 @@ static bool getCoverageFormat4(vector<uint32_t>& coverage, const uint8_t* data, } uint32_t glyphId = readU16(data, actualRangeOffset); if (glyphId != 0) { - addRange(coverage, j, j + 1); + if (!addRange(coverage, j, j + 1)) { + return false; + } } } } @@ -126,7 +142,9 @@ static bool getCoverageFormat12(vector<uint32_t>& coverage, const uint8_t* data, android_errorWriteLog(0x534e4554, "26413177"); return false; } - addRange(coverage, start, end + 1); // file is inclusive, vector is exclusive + if (!addRange(coverage, start, end + 1)) { // file is inclusive, vector is exclusive + return false; + } } return true; } |