Relax pitch check in CFX_DIBitmap::CalculatePitchAndSize()
When a pitch value has been provided, check it is valid, but do not
require it to be a multiple of 4.
Bug: pdfium:2112
Change-Id: Ia282e45e9af38ec8abcef1890c43b27449f43d2c
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/115310
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/dib/cfx_dibitmap.cpp b/core/fxge/dib/cfx_dibitmap.cpp
index fa5b1b1..f3d70e4 100644
--- a/core/fxge/dib/cfx_dibitmap.cpp
+++ b/core/fxge/dib/cfx_dibitmap.cpp
@@ -677,14 +677,16 @@
if (!bpp) {
return absl::nullopt;
}
- absl::optional<uint32_t> pitch32 = fxge::CalculatePitch32(bpp, width);
- if (!pitch32.has_value()) {
- return absl::nullopt;
- }
if (pitch == 0) {
+ absl::optional<uint32_t> pitch32 = fxge::CalculatePitch32(bpp, width);
+ if (!pitch32.has_value()) {
+ return absl::nullopt;
+ }
pitch = pitch32.value();
} else {
- if (pitch < pitch32.value()) {
+ absl::optional<uint32_t> actual_pitch =
+ fxge::CalculatePitch8(bpp, /*components=*/1, width);
+ if (!actual_pitch.has_value() || pitch < actual_pitch.value()) {
return absl::nullopt;
}
}
diff --git a/fpdfsdk/fpdf_view_embeddertest.cpp b/fpdfsdk/fpdf_view_embeddertest.cpp
index 41e6ae6..d708e8a 100644
--- a/fpdfsdk/fpdf_view_embeddertest.cpp
+++ b/fpdfsdk/fpdf_view_embeddertest.cpp
@@ -2183,6 +2183,5 @@
std::vector<uint8_t> vec(kStride * kHeight);
ScopedFPDFBitmap bitmap(FPDFBitmap_CreateEx(kWidth, kHeight, FPDFBitmap_BGR,
vec.data(), kStride));
- // TODO(crbug.com/pdfium/2112): Should return FPDFBitmap_BGR.
- EXPECT_EQ(FPDFBitmap_Unknown, FPDFBitmap_GetFormat(bitmap.get()));
+ EXPECT_EQ(FPDFBitmap_BGR, FPDFBitmap_GetFormat(bitmap.get()));
}