Replace memcpy() with safer spancpy() in fx_crypt.cpp
Change-Id: I9d168fab4580bc1d7802fa4f4c0b52c65293198a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/101530
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fdrm/fx_crypt.cpp b/core/fdrm/fx_crypt.cpp
index cf7ef58..c702f92 100644
--- a/core/fdrm/fx_crypt.cpp
+++ b/core/fdrm/fx_crypt.cpp
@@ -6,10 +6,10 @@
#include "core/fdrm/fx_crypt.h"
-#include <string.h>
-
#include <utility>
+#include "core/fxcrt/span_util.h"
+
#define GET_UINT32(n, b, i) \
{ \
(n) = (uint32_t)((uint8_t*)b)[(i)] | \
@@ -195,21 +195,20 @@
context->total[1] += data.size() >> 29;
context->total[0] &= 0xFFFFFFFF;
context->total[1] += context->total[0] < data.size() << 3;
+
+ const pdfium::span<uint8_t> buffer_span = pdfium::make_span(context->buffer);
if (left && data.size() >= fill) {
- auto next_data = data.subspan(fill);
- memcpy(context->buffer + left, data.data(), fill);
+ fxcrt::spancpy(buffer_span.subspan(left), data.first(fill));
md5_process(context, context->buffer);
+ data = data.subspan(fill);
left = 0;
- data = next_data;
}
while (data.size() >= 64) {
- auto next_data = data.subspan(64);
md5_process(context, data.data());
- data = next_data;
+ data = data.subspan(64);
}
- size_t remaining = data.size();
- if (remaining)
- memcpy(context->buffer + left, data.data(), remaining);
+ if (!data.empty())
+ fxcrt::spancpy(buffer_span.subspan(left), data);
}
void CRYPT_MD5Finish(CRYPT_md5_context* context, uint8_t digest[16]) {
@@ -218,7 +217,7 @@
PUT_UINT32(context->total[1], msglen, 4);
uint32_t last = (context->total[0] >> 3) & 0x3F;
uint32_t padn = (last < 56) ? (56 - last) : (120 - last);
- CRYPT_MD5Update(context, {md5_padding, padn});
+ CRYPT_MD5Update(context, pdfium::make_span(md5_padding).first(padn));
CRYPT_MD5Update(context, msglen);
PUT_UINT32(context->state[0], digest, 0);
PUT_UINT32(context->state[1], digest, 4);