Avoid pointer arithmetic in CFX_FileBufferArchive
Change-Id: Ibfa521bf0278e3e185453b9522e13b94e9faf6bd
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/96971
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp
index 0215a21..9e45400 100644
--- a/core/fpdfapi/edit/cpdf_creator.cpp
+++ b/core/fpdfapi/edit/cpdf_creator.cpp
@@ -48,14 +48,16 @@
bool Flush();
FX_FILESIZE offset_ = 0;
- size_t current_length_ = 0;
DataVector<uint8_t> buffer_;
+ pdfium::span<uint8_t> available_;
RetainPtr<IFX_RetainableWriteStream> backing_file_;
};
CFX_FileBufferArchive::CFX_FileBufferArchive(
RetainPtr<IFX_RetainableWriteStream> file)
- : buffer_(kArchiveBufferSize), backing_file_(std::move(file)) {
+ : buffer_(kArchiveBufferSize),
+ available_(buffer_),
+ backing_file_(std::move(file)) {
DCHECK(backing_file_);
}
@@ -64,32 +66,28 @@
}
bool CFX_FileBufferArchive::Flush() {
- size_t nRemaining = current_length_;
- current_length_ = 0;
+ size_t nUsed = buffer_.size() - available_.size();
+ available_ = pdfium::make_span(buffer_);
if (!backing_file_)
return false;
- if (!nRemaining)
+ if (!nUsed)
return true;
- return backing_file_->WriteBlock(buffer_.data(), nRemaining);
+ return backing_file_->WriteBlock(buffer_.data(), nUsed);
}
bool CFX_FileBufferArchive::WriteBlock(const void* pBuf, size_t size) {
DCHECK(pBuf);
DCHECK(size > 0);
- const uint8_t* buffer = reinterpret_cast<const uint8_t*>(pBuf);
- size_t temp_size = size;
- while (temp_size) {
- size_t buf_size = std::min(kArchiveBufferSize - current_length_, temp_size);
- fxcrt::spancpy(pdfium::make_span(buffer_).subspan(current_length_),
- pdfium::make_span(buffer, buf_size));
-
- current_length_ += buf_size;
- if (current_length_ == kArchiveBufferSize && !Flush())
+ auto* pSrc = reinterpret_cast<const uint8_t*>(pBuf);
+ pdfium::span<const uint8_t> src_span(pSrc, size);
+ while (!src_span.empty()) {
+ size_t copy_size = std::min(available_.size(), src_span.size());
+ fxcrt::spancpy(available_, src_span.first(copy_size));
+ src_span = src_span.subspan(copy_size);
+ available_ = available_.subspan(copy_size);
+ if (available_.empty() && !Flush())
return false;
-
- temp_size -= buf_size;
- buffer += buf_size;
}
FX_SAFE_FILESIZE safe_offset = offset_;