Fix unsafe buffers in android/skia fxge file.
Convert to arrays and spans.
Change-Id: Icc48d8a3b7cda47a50d5cb4794ec86ac3b03452a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/119890
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
Reviewed-by: Thomas Sepez <tsepez@google.com>
diff --git a/core/fxge/android/cfpf_skiafontmgr.cpp b/core/fxge/android/cfpf_skiafontmgr.cpp
index 76a3db8..0da444d 100644
--- a/core/fxge/android/cfpf_skiafontmgr.cpp
+++ b/core/fxge/android/cfpf_skiafontmgr.cpp
@@ -4,14 +4,10 @@
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-#if defined(UNSAFE_BUFFERS_BUILD)
-// TODO(crbug.com/pdfium/2154): resolve buffer safety issues.
-#pragma allow_unsafe_buffers
-#endif
-
#include "core/fxge/android/cfpf_skiafontmgr.h"
#include <algorithm>
+#include <array>
#include <iterator>
#include <utility>
@@ -20,6 +16,7 @@
#include "core/fxcrt/fx_extension.h"
#include "core/fxcrt/fx_folder.h"
#include "core/fxcrt/fx_system.h"
+#include "core/fxcrt/stl_util.h"
#include "core/fxge/android/cfpf_skiafont.h"
#include "core/fxge/android/cfpf_skiapathfont.h"
#include "core/fxge/freetype/fx_freetype.h"
@@ -58,15 +55,15 @@
};
uint32_t FPF_SkiaGetSubstFont(uint32_t dwHash,
- const FPF_SKIAFONTMAP* skFontMap,
- size_t length) {
- const FPF_SKIAFONTMAP* pEnd = skFontMap + length;
- const FPF_SKIAFONTMAP* pFontMap = std::lower_bound(
- skFontMap, pEnd, dwHash, [](const FPF_SKIAFONTMAP& item, uint32_t hash) {
- return item.dwFamily < hash;
- });
- if (pFontMap < pEnd && pFontMap->dwFamily == dwHash)
+ pdfium::span<const FPF_SKIAFONTMAP> skFontMap) {
+ const FPF_SKIAFONTMAP* pFontMap =
+ std::lower_bound(skFontMap.begin(), skFontMap.end(), dwHash,
+ [](const FPF_SKIAFONTMAP& item, uint32_t hash) {
+ return item.dwFamily < hash;
+ });
+ if (pFontMap != skFontMap.end() && pFontMap->dwFamily == dwHash) {
return pFontMap->dwSubSt;
+ }
return 0;
}
@@ -169,7 +166,7 @@
return bsName.Contains("arabic");
}
-const uint32_t kFPFSkiaFontCharsets[] = {
+constexpr auto kFPFSkiaFontCharsets = fxcrt::ToArray<const uint32_t>({
FPF_SKIACHARSET_Ansi,
FPF_SKIACHARSET_EeasternEuropean,
FPF_SKIACHARSET_Cyrillic,
@@ -202,7 +199,7 @@
0,
FPF_SKIACHARSET_OEM,
FPF_SKIACHARSET_Symbol,
-};
+});
uint32_t FPF_SkiaGetFaceCharset(uint32_t code_range) {
uint32_t charset = 0;
@@ -252,10 +249,8 @@
return family_iter->second.get();
uint32_t dwFaceName = FPF_SKIANormalizeFontName(bsFamilyname);
- uint32_t dwSubst =
- FPF_SkiaGetSubstFont(dwFaceName, kSkiaFontmap, std::size(kSkiaFontmap));
- uint32_t dwSubstSans = FPF_SkiaGetSubstFont(dwFaceName, kSkiaSansFontMap,
- std::size(kSkiaSansFontMap));
+ uint32_t dwSubst = FPF_SkiaGetSubstFont(dwFaceName, kSkiaFontmap);
+ uint32_t dwSubstSans = FPF_SkiaGetSubstFont(dwFaceName, kSkiaSansFontMap);
bool bMaybeSymbol = FPF_SkiaMaybeSymbol(bsFamilyname);
if (uCharset != FX_Charset::kMSWin_Arabic &&
FPF_SkiaMaybeArabic(bsFamilyname)) {