Use more spans in streams, part 2.

Change-Id: I5065b6961eab046537e04219be7317ac5e75d0d2
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/100531
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_seekablemultistream.cpp b/core/fpdfapi/parser/cpdf_seekablemultistream.cpp
index c99d079..50571d3 100644
--- a/core/fpdfapi/parser/cpdf_seekablemultistream.cpp
+++ b/core/fpdfapi/parser/cpdf_seekablemultistream.cpp
@@ -60,7 +60,7 @@
   return false;
 }
 
-size_t CPDF_SeekableMultiStream::ReadBlock(void* buffer, size_t size) {
+size_t CPDF_SeekableMultiStream::ReadBlock(pdfium::span<uint8_t> buffer) {
   NOTREACHED();
   return 0;
 }
diff --git a/core/fpdfapi/parser/cpdf_seekablemultistream.h b/core/fpdfapi/parser/cpdf_seekablemultistream.h
index 30d62d8..a66194a 100644
--- a/core/fpdfapi/parser/cpdf_seekablemultistream.h
+++ b/core/fpdfapi/parser/cpdf_seekablemultistream.h
@@ -26,7 +26,7 @@
   FX_FILESIZE GetSize() override;
   bool ReadBlockAtOffset(pdfium::span<uint8_t> buffer,
                          FX_FILESIZE offset) override;
-  size_t ReadBlock(void* buffer, size_t size) override;
+  size_t ReadBlock(pdfium::span<uint8_t> buffer) override;
   bool IsEOF() override;
   bool Flush() override;
   bool WriteBlockAtOffset(const void* pData,
diff --git a/core/fxcrt/cfx_memorystream.cpp b/core/fxcrt/cfx_memorystream.cpp
index b88c7bc..7d05992 100644
--- a/core/fxcrt/cfx_memorystream.cpp
+++ b/core/fxcrt/cfx_memorystream.cpp
@@ -56,15 +56,14 @@
   return true;
 }
 
-size_t CFX_MemoryStream::ReadBlock(void* buffer, size_t size) {
+size_t CFX_MemoryStream::ReadBlock(pdfium::span<uint8_t> buffer) {
   if (m_nCurPos >= m_nCurSize)
     return 0;
 
-  size_t nRead = std::min(size, m_nCurSize - m_nCurPos);
-  if (!ReadBlockAtOffset({static_cast<uint8_t*>(buffer), nRead},
-                         static_cast<int32_t>(m_nCurPos))) {
+  size_t nRead = std::min(buffer.size(), m_nCurSize - m_nCurPos);
+  if (!ReadBlockAtOffset(buffer.first(nRead), static_cast<int32_t>(m_nCurPos)))
     return 0;
-  }
+
   return nRead;
 }
 
diff --git a/core/fxcrt/cfx_memorystream.h b/core/fxcrt/cfx_memorystream.h
index b1bbefa..858efa0 100644
--- a/core/fxcrt/cfx_memorystream.h
+++ b/core/fxcrt/cfx_memorystream.h
@@ -22,7 +22,7 @@
   bool IsEOF() override;
   bool ReadBlockAtOffset(pdfium::span<uint8_t> buffer,
                          FX_FILESIZE offset) override;
-  size_t ReadBlock(void* buffer, size_t size) override;
+  size_t ReadBlock(pdfium::span<uint8_t> buffer) override;
   bool WriteBlockAtOffset(const void* buffer,
                           FX_FILESIZE offset,
                           size_t size) override;
diff --git a/core/fxcrt/fx_stream.cpp b/core/fxcrt/fx_stream.cpp
index b593906..31ddbf8 100644
--- a/core/fxcrt/fx_stream.cpp
+++ b/core/fxcrt/fx_stream.cpp
@@ -25,8 +25,8 @@
                          FX_FILESIZE offset) override {
     return m_pFile->ReadPos(buffer.data(), buffer.size(), offset) > 0;
   }
-  size_t ReadBlock(void* buffer, size_t size) override {
-    return m_pFile->Read(buffer, size);
+  size_t ReadBlock(pdfium::span<uint8_t> buffer) override {
+    return m_pFile->Read(buffer.data(), buffer.size());
   }
   bool WriteBlockAtOffset(const void* buffer,
                           FX_FILESIZE offset,
@@ -90,7 +90,7 @@
   return 0;
 }
 
-size_t IFX_SeekableReadStream::ReadBlock(void* buffer, size_t size) {
+size_t IFX_SeekableReadStream::ReadBlock(pdfium::span<uint8_t> buffer) {
   return 0;
 }
 
diff --git a/core/fxcrt/fx_stream.h b/core/fxcrt/fx_stream.h
index 290f06a..a2a04f2 100644
--- a/core/fxcrt/fx_stream.h
+++ b/core/fxcrt/fx_stream.h
@@ -64,8 +64,7 @@
 
   virtual bool IsEOF();
   virtual FX_FILESIZE GetPosition();
-  virtual size_t ReadBlock(void* buffer, size_t size);
-
+  [[nodiscard]] virtual size_t ReadBlock(pdfium::span<uint8_t> buffer);
   [[nodiscard]] virtual bool ReadBlockAtOffset(pdfium::span<uint8_t> buffer,
                                                FX_FILESIZE offset) = 0;
 };
diff --git a/fpdfsdk/cpdfsdk_helpers.cpp b/fpdfsdk/cpdfsdk_helpers.cpp
index 584a0b6..3727b28 100644
--- a/fpdfsdk/cpdfsdk_helpers.cpp
+++ b/fpdfsdk/cpdfsdk_helpers.cpp
@@ -86,7 +86,7 @@
   FX_FILESIZE GetPosition() override;
   bool ReadBlockAtOffset(pdfium::span<uint8_t> buffer,
                          FX_FILESIZE offset) override;
-  size_t ReadBlock(void* buffer, size_t size) override;
+  size_t ReadBlock(pdfium::span<uint8_t> buffer) override;
   bool WriteBlockAtOffset(const void* buffer,
                           FX_FILESIZE offset,
                           size_t size) override;
@@ -138,20 +138,21 @@
   return false;
 }
 
-size_t FPDF_FileHandlerContext::ReadBlock(void* buffer, size_t size) {
-  if (!buffer || !size || !m_pFS->ReadBlock)
+size_t FPDF_FileHandlerContext::ReadBlock(pdfium::span<uint8_t> buffer) {
+  if (buffer.empty() || !m_pFS->ReadBlock)
     return 0;
 
   FX_FILESIZE nSize = GetSize();
   if (m_nCurPos >= nSize)
     return 0;
   FX_FILESIZE dwAvail = nSize - m_nCurPos;
-  if (dwAvail < (FX_FILESIZE)size)
-    size = static_cast<size_t>(dwAvail);
-  if (m_pFS->ReadBlock(m_pFS->clientData, (FPDF_DWORD)m_nCurPos, buffer,
-                       (FPDF_DWORD)size) == 0) {
-    m_nCurPos += size;
-    return size;
+  if (dwAvail < (FX_FILESIZE)buffer.size())
+    buffer = buffer.first(static_cast<size_t>(dwAvail));
+  if (m_pFS->ReadBlock(m_pFS->clientData, static_cast<FPDF_DWORD>(m_nCurPos),
+                       buffer.data(),
+                       static_cast<FPDF_DWORD>(buffer.size())) == 0) {
+    m_nCurPos += buffer.size();
+    return buffer.size();
   }
 
   return 0;
diff --git a/fxjs/xfa/cfxjse_formcalc_context.cpp b/fxjs/xfa/cfxjse_formcalc_context.cpp
index 0f2fff2..4fc19d7 100644
--- a/fxjs/xfa/cfxjse_formcalc_context.cpp
+++ b/fxjs/xfa/cfxjse_formcalc_context.cpp
@@ -4512,7 +4512,9 @@
 
   FX_FILESIZE size = pFile->GetSize();
   DataVector<uint8_t> dataBuf(size);
-  pFile->ReadBlock(dataBuf.data(), size);
+
+  // TODO(tsepez): check return value?
+  (void)pFile->ReadBlock(dataBuf);
   info.GetReturnValue().Set(
       fxv8::NewStringHelper(info.GetIsolate(), ByteStringView(dataBuf)));
 }