Convert UNSAFE_TODO() to UNSAFE_BUFFERS() at API point. Updates TestAsyncLoader. We need to trust the caller across a public API, so move the unsafe conversion right up against it, and use spans further down. Change-Id: Ida01dbba15064ee36c4e4435bedae1c831232244 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/133293 Reviewed-by: Lei Zhang <thestig@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/fpdf_dataavail_embeddertest.cpp b/fpdfsdk/fpdf_dataavail_embeddertest.cpp index 834ec53..12c6a65 100644 --- a/fpdfsdk/fpdf_dataavail_embeddertest.cpp +++ b/fpdfsdk/fpdf_dataavail_embeddertest.cpp
@@ -107,18 +107,16 @@ return available_ranges_.Contains(RangeSet::Range(start, start + size)); } - int GetBlockImpl(unsigned long pos, unsigned char* pBuf, unsigned long size) { - if (!IsDataAvailImpl(pos, size)) { + int GetBlockImpl(size_t pos, pdfium::span<unsigned char> buf) { + if (!IsDataAvailImpl(pos, buf.size())) { return 0; } - const unsigned long end = std::min( - pdfium::checked_cast<unsigned long>(file_contents_.size()), pos + size); + const size_t end = std::min(file_contents_.size(), buf.size() + pos); if (end <= pos) { return 0; } - const unsigned long bytes_to_copy = end - pos; - fxcrt::Copy(file_contents().subspan(pos, bytes_to_copy), - UNSAFE_TODO(pdfium::span(pBuf, size))); + const size_t bytes_to_copy = end - pos; + fxcrt::Copy(file_contents().subspan(pos, bytes_to_copy), buf); SetDataAvailable(pos, bytes_to_copy); return static_cast<int>(bytes_to_copy); } @@ -143,7 +141,9 @@ unsigned long pos, unsigned char* pBuf, unsigned long size) { - return static_cast<TestAsyncLoader*>(param)->GetBlockImpl(pos, pBuf, size); + // SAFETY: required from caller across public API. + return static_cast<TestAsyncLoader*>(param)->GetBlockImpl( + pos, UNSAFE_BUFFERS(pdfium::span(pBuf, size))); } static void SAddSegment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {