Change CFX_BmpDecompressor::ReadData() to take a span. Fewer parameters and no need for checked_cast(). Change-Id: I3ce0b777333c2bdd78c3edd6e416e39978c28ca2 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/88390 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcodec/bmp/cfx_bmpdecompressor.cpp b/core/fxcodec/bmp/cfx_bmpdecompressor.cpp index 90e087e..1931774 100644 --- a/core/fxcodec/bmp/cfx_bmpdecompressor.cpp +++ b/core/fxcodec/bmp/cfx_bmpdecompressor.cpp
@@ -87,10 +87,8 @@ BmpDecoder::Status CFX_BmpDecompressor::ReadBmpHeader() { BmpFileHeader bmp_header; - if (!ReadData(reinterpret_cast<uint8_t*>(&bmp_header), - sizeof(BmpFileHeader))) { + if (!ReadData(pdfium::as_writable_bytes(pdfium::make_span(&bmp_header, 1)))) return BmpDecoder::Status::kContinue; - } bmp_header.bfType = FXSYS_UINT16_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&bmp_header.bfType)); @@ -102,8 +100,8 @@ return BmpDecoder::Status::kFail; size_t pos = input_buffer_->GetPosition(); - if (!ReadData(reinterpret_cast<uint8_t*>(&img_ifh_size_), - sizeof(img_ifh_size_))) { + if (!ReadData( + pdfium::as_writable_bytes(pdfium::make_span(&img_ifh_size_, 1)))) { return BmpDecoder::Status::kContinue; } if (!input_buffer_->Seek(pos)) @@ -123,8 +121,8 @@ if (img_ifh_size_ == kBmpCoreHeaderSize) { pal_type_ = 1; BmpCoreHeader bmp_core_header; - if (!ReadData(reinterpret_cast<uint8_t*>(&bmp_core_header), - sizeof(BmpCoreHeader))) { + if (!ReadData(pdfium::as_writable_bytes( + pdfium::make_span(&bmp_core_header, 1)))) { return BmpDecoder::Status::kContinue; } @@ -141,8 +139,8 @@ if (img_ifh_size_ == kBmpInfoHeaderSize) { BmpInfoHeader bmp_info_header; - if (!ReadData(reinterpret_cast<uint8_t*>(&bmp_info_header), - sizeof(BmpInfoHeader))) { + if (!ReadData(pdfium::as_writable_bytes( + pdfium::make_span(&bmp_info_header, 1)))) { return BmpDecoder::Status::kContinue; } @@ -170,8 +168,8 @@ FX_SAFE_SIZE_T new_pos = input_buffer_->GetPosition(); BmpInfoHeader bmp_info_header; - if (!ReadData(reinterpret_cast<uint8_t*>(&bmp_info_header), - sizeof(bmp_info_header))) { + if (!ReadData( + pdfium::as_writable_bytes(pdfium::make_span(&bmp_info_header, 1)))) { return BmpDecoder::Status::kContinue; } @@ -270,7 +268,7 @@ return BmpDecoder::Status::kFail; uint32_t masks[3]; - if (!ReadData(reinterpret_cast<uint8_t*>(masks), sizeof(masks))) + if (!ReadData(pdfium::as_writable_bytes(pdfium::make_span(masks)))) return BmpDecoder::Status::kContinue; mask_red_ = FXSYS_UINT32_GET_LSBFIRST(reinterpret_cast<uint8_t*>(&masks[0])); @@ -297,10 +295,10 @@ pal_num_ = 1 << bit_counts_; if (color_used_ != 0) pal_num_ = color_used_; - uint32_t src_pal_size = pal_num_ * (pal_type_ ? 3 : 4); + size_t src_pal_size = pal_num_ * (pal_type_ ? 3 : 4); std::vector<uint8_t, FxAllocAllocator<uint8_t>> src_pal(src_pal_size); uint8_t* src_pal_data = src_pal.data(); - if (!ReadData(src_pal_data, src_pal_size)) + if (!ReadData(src_pal)) return BmpDecoder::Status::kContinue; palette_.resize(pal_num_); @@ -372,10 +370,9 @@ std::vector<uint8_t, FxAllocAllocator<uint8_t>> dest_buf(src_row_bytes_); while (row_num_ < height_) { size_t idx = 0; - if (!ReadData(dest_buf.data(), - pdfium::base::checked_cast<uint32_t>(src_row_bytes_))) { + if (!ReadData(dest_buf)) return BmpDecoder::Status::kContinue; - } + SaveDecodingStatus(DecodeStatus::kData); switch (bit_counts_) { case 1: { @@ -446,12 +443,12 @@ uint8_t first_part; col_num_ = 0; while (true) { - if (!ReadData(&first_part, sizeof(first_part))) + if (!ReadData(pdfium::make_span(&first_part, 1))) return BmpDecoder::Status::kContinue; switch (first_part) { case kRleMarker: { - if (!ReadData(&first_part, sizeof(first_part))) + if (!ReadData(pdfium::make_span(&first_part, 1))) return BmpDecoder::Status::kContinue; switch (first_part) { @@ -475,7 +472,7 @@ } case kRleDelta: { uint8_t delta[2]; - if (!ReadData(delta, sizeof(delta))) + if (!ReadData(delta)) return BmpDecoder::Status::kContinue; col_num_ += delta[0]; @@ -500,9 +497,7 @@ std::vector<uint8_t, FxAllocAllocator<uint8_t>> second_part( second_part_size); uint8_t* second_part_data = second_part.data(); - if (!ReadData( - second_part_data, - pdfium::base::checked_cast<uint32_t>(second_part_size))) + if (!ReadData(second_part)) return BmpDecoder::Status::kContinue; std::copy(second_part_data, second_part_data + first_part, @@ -523,7 +518,7 @@ return BmpDecoder::Status::kFail; uint8_t second_part; - if (!ReadData(&second_part, sizeof(second_part))) + if (!ReadData(pdfium::make_span(&second_part, 1))) return BmpDecoder::Status::kContinue; std::fill(out_row_buffer_.begin() + col_num_, @@ -540,12 +535,12 @@ uint8_t first_part; col_num_ = 0; while (true) { - if (!ReadData(&first_part, sizeof(first_part))) + if (!ReadData(pdfium::make_span(&first_part, 1))) return BmpDecoder::Status::kContinue; switch (first_part) { case kRleMarker: { - if (!ReadData(&first_part, sizeof(first_part))) + if (!ReadData(pdfium::make_span(&first_part, 1))) return BmpDecoder::Status::kContinue; switch (first_part) { @@ -569,7 +564,7 @@ } case kRleDelta: { uint8_t delta[2]; - if (!ReadData(delta, sizeof(delta))) + if (!ReadData(delta)) return BmpDecoder::Status::kContinue; col_num_ += delta[0]; @@ -599,11 +594,9 @@ std::vector<uint8_t, FxAllocAllocator<uint8_t>> second_part( second_part_size); uint8_t* second_part_data = second_part.data(); - if (!ReadData( - second_part_data, - pdfium::base::checked_cast<uint32_t>(second_part_size))) { + if (!ReadData(second_part)) return BmpDecoder::Status::kContinue; - } + for (uint8_t i = 0; i < first_part; i++) { uint8_t color = (i & 0x01) ? (*second_part_data++ & 0x0F) : (*second_part_data & 0xF0) >> 4; @@ -630,7 +623,7 @@ first_part = avail_size - 1; } uint8_t second_part; - if (!ReadData(&second_part, sizeof(second_part))) + if (!ReadData(pdfium::make_span(&second_part, 1))) return BmpDecoder::Status::kContinue; for (uint8_t i = 0; i < first_part; i++) { @@ -647,8 +640,9 @@ } } -bool CFX_BmpDecompressor::ReadData(uint8_t* destination, uint32_t size) { - return input_buffer_ && input_buffer_->ReadBlock(destination, size) == size; +bool CFX_BmpDecompressor::ReadData(pdfium::span<uint8_t> buf) { + return input_buffer_ && + input_buffer_->ReadBlock(buf.data(), buf.size()) == buf.size(); } void CFX_BmpDecompressor::SaveDecodingStatus(DecodeStatus status) {
diff --git a/core/fxcodec/bmp/cfx_bmpdecompressor.h b/core/fxcodec/bmp/cfx_bmpdecompressor.h index 7e39d33..9151f40 100644 --- a/core/fxcodec/bmp/cfx_bmpdecompressor.h +++ b/core/fxcodec/bmp/cfx_bmpdecompressor.h
@@ -14,6 +14,7 @@ #include "core/fxcrt/fx_memory_wrappers.h" #include "core/fxcrt/retain_ptr.h" #include "core/fxcrt/unowned_ptr.h" +#include "third_party/base/span.h" class CFX_CodecMemory; @@ -59,7 +60,7 @@ BmpDecoder::Status DecodeRGB(); BmpDecoder::Status DecodeRLE8(); BmpDecoder::Status DecodeRLE4(); - bool ReadData(uint8_t* destination, uint32_t size); + bool ReadData(pdfium::span<uint8_t> buf); void SaveDecodingStatus(DecodeStatus status); bool ValidateColorIndex(uint8_t val) const; bool ValidateFlag() const;