Fix several UBsan issues with memcpy

Most of the changes are trivial.

Bug: webrtc:14432
Change-Id: I0444527bf57c72c8d65f69754b4a4a1c1d7b2e92
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/275340
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Victor Boivie <boivie@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38074}
diff --git a/modules/rtp_rtcp/source/rtcp_packet/app.cc b/modules/rtp_rtcp/source/rtcp_packet/app.cc
index c839b72..d5734c6 100644
--- a/modules/rtp_rtcp/source/rtcp_packet/app.cc
+++ b/modules/rtp_rtcp/source/rtcp_packet/app.cc
@@ -91,7 +91,9 @@
 
   ByteWriter<uint32_t>::WriteBigEndian(&packet[*index + 0], sender_ssrc());
   ByteWriter<uint32_t>::WriteBigEndian(&packet[*index + 4], name_);
-  memcpy(&packet[*index + 8], data_.data(), data_.size());
+  if (!data_.empty()) {
+    memcpy(&packet[*index + 8], data_.data(), data_.size());
+  }
   *index += (8 + data_.size());
   RTC_DCHECK_EQ(index_end, *index);
   return true;
diff --git a/modules/rtp_rtcp/source/rtp_packet.cc b/modules/rtp_rtcp/source/rtp_packet.cc
index 1616024..e26cec5 100644
--- a/modules/rtp_rtcp/source/rtp_packet.cc
+++ b/modules/rtp_rtcp/source/rtp_packet.cc
@@ -672,8 +672,12 @@
   }
 
   // Copy payload data to new packet.
-  memcpy(new_packet.AllocatePayload(payload_size()), payload().data(),
-         payload_size());
+  if (payload_size() > 0) {
+    memcpy(new_packet.AllocatePayload(payload_size()), payload().data(),
+           payload_size());
+  } else {
+    new_packet.SetPayloadSize(0);
+  }
 
   // Allocate padding -- must be last!
   new_packet.SetPadding(padding_size());
diff --git a/modules/rtp_rtcp/source/rtp_packetizer_av1.cc b/modules/rtp_rtcp/source/rtp_packetizer_av1.cc
index 9cca983..c866c60 100644
--- a/modules/rtp_rtcp/source/rtp_packetizer_av1.cc
+++ b/modules/rtp_rtcp/source/rtp_packetizer_av1.cc
@@ -383,7 +383,9 @@
     int payload_offset =
         std::max(0, obu_offset - (ObuHasExtension(obu.header) ? 2 : 1));
     size_t payload_size = obu.payload.size() - payload_offset;
-    memcpy(write_at, obu.payload.data() + payload_offset, payload_size);
+    if (!obu.payload.empty() && payload_size > 0) {
+      memcpy(write_at, obu.payload.data() + payload_offset, payload_size);
+    }
     write_at += payload_size;
     // All obus are stored from the beginning, except, may be, the first one.
     obu_offset = 0;
diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc
index adf7384..f1f7544 100644
--- a/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/modules/rtp_rtcp/source/rtp_sender.cc
@@ -694,7 +694,9 @@
 
   // Add original payload data.
   auto payload = packet.payload();
-  memcpy(rtx_payload + kRtxHeaderSize, payload.data(), payload.size());
+  if (!payload.empty()) {
+    memcpy(rtx_payload + kRtxHeaderSize, payload.data(), payload.size());
+  }
 
   // Add original additional data.
   rtx_packet->set_additional_data(packet.additional_data());
diff --git a/net/dcsctp/packet/bounded_byte_writer.h b/net/dcsctp/packet/bounded_byte_writer.h
index 467f268..d754549 100644
--- a/net/dcsctp/packet/bounded_byte_writer.h
+++ b/net/dcsctp/packet/bounded_byte_writer.h
@@ -88,8 +88,11 @@
   }
 
   void CopyToVariableData(rtc::ArrayView<const uint8_t> source) {
-    memcpy(data_.data() + FixedSize, source.data(),
-           std::min(source.size(), data_.size() - FixedSize));
+    size_t copy_size = std::min(source.size(), data_.size() - FixedSize);
+    if (source.data() == nullptr || copy_size == 0) {
+      return;
+    }
+    memcpy(data_.data() + FixedSize, source.data(), copy_size);
   }
 
  private:
diff --git a/rtc_base/memory_stream.cc b/rtc_base/memory_stream.cc
index 94d31ad..cbd78ac 100644
--- a/rtc_base/memory_stream.cc
+++ b/rtc_base/memory_stream.cc
@@ -128,7 +128,9 @@
     return SR_SUCCESS;
 
   if (char* new_buffer = new char[size]) {
-    memcpy(new_buffer, buffer_, data_length_);
+    if (buffer_ != nullptr && data_length_ > 0) {
+      memcpy(new_buffer, buffer_, data_length_);
+    }
     delete[] buffer_;
     buffer_ = new_buffer;
     buffer_length_ = size;