Make span_util.h wrappers completely compliant with ubsan.
Skirt the memcpy(0, 0, 0) issue and be completely conforming with
spec since the pointers are marked non-null.
Bug: pdfium:2066
Change-Id: I31e1cb3e9a8a69b2e2039e3516a0f97f7658b5ba
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/109910
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcrt/span_util.h b/core/fxcrt/span_util.h
index c911617..99fc25c 100644
--- a/core/fxcrt/span_util.h
+++ b/core/fxcrt/span_util.h
@@ -17,8 +17,10 @@
typename U,
typename = pdfium::internal::EnableIfLegalSpanConversion<T, U>>
void spancpy(pdfium::span<T> dst, pdfium::span<U> src) {
- CHECK_GE(dst.size_bytes(), src.size_bytes());
- memcpy(dst.data(), src.data(), src.size_bytes());
+ if (src.size_bytes()) {
+ CHECK_GE(dst.size_bytes(), src.size_bytes());
+ memcpy(dst.data(), src.data(), src.size_bytes());
+ }
}
// Bounds-checked moves from spans into spans.
@@ -26,20 +28,26 @@
typename U,
typename = pdfium::internal::EnableIfLegalSpanConversion<T, U>>
void spanmove(pdfium::span<T> dst, pdfium::span<U> src) {
- CHECK_GE(dst.size_bytes(), src.size_bytes());
- memmove(dst.data(), src.data(), src.size_bytes());
+ if (src.size_bytes()) {
+ CHECK_GE(dst.size_bytes(), src.size_bytes());
+ memmove(dst.data(), src.data(), src.size_bytes());
+ }
}
// Bounds-checked sets into spans.
template <typename T>
void spanset(pdfium::span<T> dst, uint8_t val) {
- memset(dst.data(), val, dst.size_bytes());
+ if (dst.size_bytes()) {
+ memset(dst.data(), val, dst.size_bytes());
+ }
}
// Bounds-checked zeroing of spans.
template <typename T>
void spanclr(pdfium::span<T> dst) {
- memset(dst.data(), 0, dst.size_bytes());
+ if (dst.size_bytes()) {
+ memset(dst.data(), 0, dst.size_bytes());
+ }
}
} // namespace fxcrt