Prevent UB on BufferT::AppendData and ctor.

While [1] partially fixed the problem, UB was still possible when
AppendData was called with size=0 or in one of the constructors.

[1] - https://webrtc-review.googlesource.com/c/src/+/271502

Bug: webrtc:14292
Change-Id: I9196e23687ee82b7bfbe1ed43460d9f99adcd1ee
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/271980
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37814}
diff --git a/rtc_base/buffer.h b/rtc_base/buffer.h
index 819e7db..6663c68 100644
--- a/rtc_base/buffer.h
+++ b/rtc_base/buffer.h
@@ -106,7 +106,10 @@
                 internal::BufferCompat<T, U>::value>::type* = nullptr>
   BufferT(U* data, size_t size, size_t capacity) : BufferT(size, capacity) {
     static_assert(sizeof(T) == sizeof(U), "");
-    std::memcpy(data_.get(), data, size * sizeof(U));
+    if (size > 0) {
+      RTC_DCHECK(data);
+      std::memcpy(data_.get(), data, size * sizeof(U));
+    }
   }
 
   // Construct a buffer from the contents of an array.
@@ -267,10 +270,10 @@
             typename std::enable_if<
                 internal::BufferCompat<T, U>::value>::type* = nullptr>
   void AppendData(const U* data, size_t size) {
-    if (!data) {
-      RTC_CHECK_EQ(size, 0U);
+    if (size == 0) {
       return;
     }
+    RTC_DCHECK(data);
     RTC_DCHECK(IsConsistent());
     const size_t new_size = size_ + size;
     EnsureCapacityWithHeadroom(new_size, true);