From ff71a49b3008c96898324ffe1a6850e1eaceb62f Mon Sep 17 00:00:00 2001 From: Zach Stein Date: Fri, 7 Dec 2018 11:25:12 -0800 Subject: [PATCH] Reduce transaction ids independent of host byte order. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:9972 Change-Id: I91df2f2c4854bec6d581c3beb9f57235a1ce47b1 Reviewed-on: https://webrtc-review.googlesource.com/c/112926 Reviewed-by: Qingsi Wang Reviewed-by: Björn Terelius Commit-Queue: Zach Stein Cr-Commit-Position: refs/heads/master@{#25939} --- p2p/base/stun.cc | 11 +++++------ p2p/base/stun_unittest.cc | 8 ++++++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/p2p/base/stun.cc b/p2p/base/stun.cc index 33b444884d..dd0fa627b7 100644 --- a/p2p/base/stun.cc +++ b/p2p/base/stun.cc @@ -32,13 +32,12 @@ uint32_t ReduceTransactionId(const std::string& transaction_id) { RTC_DCHECK(transaction_id.length() == cricket::kStunTransactionIdLength || transaction_id.length() == cricket::kStunLegacyTransactionIdLength); - uint32_t transaction_id_as_ints[4]; - memcpy(transaction_id_as_ints, transaction_id.c_str(), - transaction_id.length()); - + ByteBufferReader reader(transaction_id.c_str(), transaction_id.length(), + rtc::ByteBuffer::ORDER_NETWORK); uint32_t result = 0; - for (size_t i = 0; i < transaction_id.length() / 4; ++i) { - result ^= transaction_id_as_ints[i]; + uint32_t next; + while (reader.ReadUInt32(&next)) { + result ^= next; } return result; } diff --git a/p2p/base/stun_unittest.cc b/p2p/base/stun_unittest.cc index 7e3b98625c..4c57b2a7ee 100644 --- a/p2p/base/stun_unittest.cc +++ b/p2p/base/stun_unittest.cc @@ -1561,4 +1561,12 @@ TEST_F(StunTest, CopyAttribute) { } } +TEST_F(StunTest, ReduceTransactionIdIsHostOrderIndependent) { + std::string transaction_id = "abcdefghijkl"; + StunMessage message; + ASSERT_TRUE(message.SetTransactionID(transaction_id)); + uint32_t reduced_transaction_id = message.reduced_transaction_id(); + EXPECT_EQ(reduced_transaction_id, 1835954016u); +} + } // namespace cricket