Re-write CPDF_CMap to avoid UNSAFE_TODO() sections.
-- Convert LoadLeadingSegments() to range-based loop using spans.
-- Spanify CheckFourByteCodeRange() while at it.
Bug: 42271176
Change-Id: I958919083243614e7f31c74555d71aac454551ad
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/120432
Reviewed-by: Thomas Sepez <tsepez@google.com>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_cmap.cpp b/core/fpdfapi/font/cpdf_cmap.cpp
index 223f400..0c2ac66 100644
--- a/core/fpdfapi/font/cpdf_cmap.cpp
+++ b/core/fpdfapi/font/cpdf_cmap.cpp
@@ -15,7 +15,6 @@
#include "core/fpdfapi/font/cpdf_fontglobals.h"
#include "core/fpdfapi/parser/cpdf_simple_parser.h"
#include "core/fxcrt/check.h"
-#include "core/fxcrt/compiler_specific.h"
#include "core/fxcrt/fx_memcpy_wrappers.h"
namespace {
@@ -221,33 +220,36 @@
std::vector<bool> LoadLeadingSegments(const PredefinedCMap& map) {
std::vector<bool> segments(256);
- for (uint32_t i = 0; i < map.m_LeadingSegCount; ++i) {
- const ByteRange& seg = UNSAFE_TODO(map.m_LeadingSegs[i]);
- for (int b = seg.m_First; b <= seg.m_Last; ++b)
+ const auto seg_span = pdfium::make_span(map.m_LeadingSegs);
+ for (const ByteRange& seg : seg_span.first(map.m_LeadingSegCount)) {
+ for (int b = seg.m_First; b <= seg.m_Last; ++b) {
segments[b] = true;
+ }
}
return segments;
}
-int CheckFourByteCodeRange(uint8_t* codes,
- size_t size,
- const std::vector<CPDF_CMap::CodeRange>& ranges) {
+int CheckFourByteCodeRange(pdfium::span<uint8_t> codes,
+ pdfium::span<const CPDF_CMap::CodeRange> ranges) {
for (size_t i = ranges.size(); i > 0; i--) {
- size_t seg = i - 1;
- if (ranges[seg].m_CharSize < size)
+ const auto& range = ranges[i - 1];
+ if (range.m_CharSize < codes.size()) {
continue;
+ }
size_t iChar = 0;
- while (iChar < size) {
- if (UNSAFE_TODO(codes[iChar] < ranges[seg].m_Lower[iChar]) ||
- UNSAFE_TODO(codes[iChar] > ranges[seg].m_Upper[iChar])) {
+ while (iChar < codes.size()) {
+ if (codes[iChar] < range.m_Lower[iChar] ||
+ codes[iChar] > range.m_Upper[iChar]) {
break;
}
++iChar;
}
- if (iChar == ranges[seg].m_CharSize)
+ if (iChar == range.m_CharSize) {
return 2;
- if (iChar)
- return (size == ranges[seg].m_CharSize) ? 2 : 1;
+ }
+ if (iChar) {
+ return (codes.size() == range.m_CharSize) ? 2 : 1;
+ }
}
return 0;
}
@@ -388,8 +390,9 @@
int char_size = 1;
codes[0] = offset < pBytes.size() ? pBytes[offset++] : 0;
while (true) {
- int ret = CheckFourByteCodeRange(codes.data(), char_size,
- m_MixedFourByteLeadingRanges);
+ int ret =
+ CheckFourByteCodeRange(pdfium::make_span(codes).first(char_size),
+ m_MixedFourByteLeadingRanges);
if (ret == 0)
return 0;
if (ret == 2) {