Fix UB when comparing two empty webrtc::Buffer objects operator== invoked std::memcmp(nullptr, nullptr, 0) when both buffers were empty, which is undefined behavior and triggers a ubsan crash. Fix the issue by returning early if both buffers have size 0. Bug: webrtc:42224551 Change-Id: I073171f57640e20115361146ebbe89e1781be0af Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/472020 Commit-Queue: Joachim Reiersen <joachimr@meta.com> Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/main@{#47694}
diff --git a/rtc_base/buffer.h b/rtc_base/buffer.h index 88b2ff7..4d0deaa 100644 --- a/rtc_base/buffer.h +++ b/rtc_base/buffer.h
@@ -198,6 +198,9 @@ if (size_ != buf.size_) { return false; } + if (size_ == 0) { + return true; + } if (std::is_integral<T>::value) { // Optimization. return std::memcmp(data_.get(), buf.data_.get(), size_ * sizeof(T)) == 0;
diff --git a/rtc_base/buffer_unittest.cc b/rtc_base/buffer_unittest.cc index 4c22667..872cf7a 100644 --- a/rtc_base/buffer_unittest.cc +++ b/rtc_base/buffer_unittest.cc
@@ -57,6 +57,12 @@ TestBuf(Buffer(kTestData.data(), 0, 20), 0, 20); } +TEST(BufferTest, TestEmptyBuffersAreEqual) { + Buffer buf1; + Buffer buf2; + EXPECT_EQ(buf1, buf2); +} + TEST(BufferTest, TestConstructData) { Buffer buf(kTestData.data(), 7); EXPECT_EQ(buf.size(), 7u);