Index: webrtc/p2p/base/stun.cc |
diff --git a/webrtc/p2p/base/stun.cc b/webrtc/p2p/base/stun.cc |
index af870d12d5975c9d7330daf92e5b1cb39541c048..4d6b21ba5465b0769f847aca5d984fd80166c581 100644 |
--- a/webrtc/p2p/base/stun.cc |
+++ b/webrtc/p2p/base/stun.cc |
@@ -19,6 +19,7 @@ |
#include "webrtc/base/crc32.h" |
#include "webrtc/base/logging.h" |
#include "webrtc/base/messagedigest.h" |
+#include "webrtc/base/ptr_util.h" |
#include "webrtc/base/stringencode.h" |
using rtc::ByteBufferReader; |
@@ -66,17 +67,18 @@ bool StunMessage::SetTransactionID(const std::string& str) { |
return true; |
} |
-void StunMessage::AddAttribute(StunAttribute* attr) { |
+void StunMessage::AddAttribute(std::unique_ptr<StunAttribute> attr) { |
// Fail any attributes that aren't valid for this type of message. |
RTC_DCHECK_EQ(attr->value_type(), GetAttributeValueType(attr->type())); |
- attrs_.emplace_back(attr); |
attr->SetOwner(this); |
size_t attr_length = attr->length(); |
if (attr_length % 4 != 0) { |
attr_length += (4 - (attr_length % 4)); |
} |
length_ += static_cast<uint16_t>(attr_length + 4); |
+ |
+ attrs_.push_back(std::move(attr)); |
} |
const StunAddressAttribute* StunMessage::GetAddress(int type) const { |
@@ -207,10 +209,10 @@ bool StunMessage::AddMessageIntegrity(const char* key, |
size_t keylen) { |
// Add the attribute with a dummy value. Since this is a known attribute, it |
// can't fail. |
- StunByteStringAttribute* msg_integrity_attr = |
- new StunByteStringAttribute(STUN_ATTR_MESSAGE_INTEGRITY, |
- std::string(kStunMessageIntegritySize, '0')); |
- AddAttribute(msg_integrity_attr); |
+ auto msg_integrity_attr_ptr = rtc::MakeUnique<StunByteStringAttribute>( |
+ STUN_ATTR_MESSAGE_INTEGRITY, std::string(kStunMessageIntegritySize, '0')); |
+ auto* msg_integrity_attr = msg_integrity_attr_ptr.get(); |
+ AddAttribute(std::move(msg_integrity_attr_ptr)); |
// Calculate the HMAC for the message. |
ByteBufferWriter buf; |
@@ -269,9 +271,10 @@ bool StunMessage::ValidateFingerprint(const char* data, size_t size) { |
bool StunMessage::AddFingerprint() { |
// Add the attribute with a dummy value. Since this is a known attribute, |
// it can't fail. |
- StunUInt32Attribute* fingerprint_attr = |
- new StunUInt32Attribute(STUN_ATTR_FINGERPRINT, 0); |
- AddAttribute(fingerprint_attr); |
+ auto fingerprint_attr_ptr = |
+ rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_FINGERPRINT, 0); |
+ auto fingerprint_attr = fingerprint_attr_ptr.get(); |
+ AddAttribute(std::move(fingerprint_attr_ptr)); |
// Calculate the CRC-32 for the message and insert it. |
ByteBufferWriter buf; |
@@ -453,33 +456,40 @@ StunAttribute* StunAttribute::Create(StunAttributeValueType value_type, |
} |
} |
-StunAddressAttribute* StunAttribute::CreateAddress(uint16_t type) { |
- return new StunAddressAttribute(type, 0); |
+std::unique_ptr<StunAddressAttribute> StunAttribute::CreateAddress( |
+ uint16_t type) { |
+ return rtc::MakeUnique<StunAddressAttribute>(type, 0); |
} |
-StunXorAddressAttribute* StunAttribute::CreateXorAddress(uint16_t type) { |
- return new StunXorAddressAttribute(type, 0, NULL); |
+std::unique_ptr<StunXorAddressAttribute> StunAttribute::CreateXorAddress( |
+ uint16_t type) { |
+ return rtc::MakeUnique<StunXorAddressAttribute>(type, 0, nullptr); |
} |
-StunUInt64Attribute* StunAttribute::CreateUInt64(uint16_t type) { |
- return new StunUInt64Attribute(type); |
+std::unique_ptr<StunUInt64Attribute> StunAttribute::CreateUInt64( |
+ uint16_t type) { |
+ return rtc::MakeUnique<StunUInt64Attribute>(type); |
} |
-StunUInt32Attribute* StunAttribute::CreateUInt32(uint16_t type) { |
- return new StunUInt32Attribute(type); |
+std::unique_ptr<StunUInt32Attribute> StunAttribute::CreateUInt32( |
+ uint16_t type) { |
+ return rtc::MakeUnique<StunUInt32Attribute>(type); |
} |
-StunByteStringAttribute* StunAttribute::CreateByteString(uint16_t type) { |
- return new StunByteStringAttribute(type, 0); |
+std::unique_ptr<StunByteStringAttribute> StunAttribute::CreateByteString( |
+ uint16_t type) { |
+ return rtc::MakeUnique<StunByteStringAttribute>(type, 0); |
} |
-StunErrorCodeAttribute* StunAttribute::CreateErrorCode() { |
- return new StunErrorCodeAttribute( |
+std::unique_ptr<StunErrorCodeAttribute> StunAttribute::CreateErrorCode() { |
+ return rtc::MakeUnique<StunErrorCodeAttribute>( |
STUN_ATTR_ERROR_CODE, StunErrorCodeAttribute::MIN_SIZE); |
} |
-StunUInt16ListAttribute* StunAttribute::CreateUnknownAttributes() { |
- return new StunUInt16ListAttribute(STUN_ATTR_UNKNOWN_ATTRIBUTES, 0); |
+std::unique_ptr<StunUInt16ListAttribute> |
+StunAttribute::CreateUnknownAttributes() { |
+ return rtc::MakeUnique<StunUInt16ListAttribute>(STUN_ATTR_UNKNOWN_ATTRIBUTES, |
+ 0); |
} |
StunAddressAttribute::StunAddressAttribute(uint16_t type, |
@@ -756,6 +766,8 @@ void StunByteStringAttribute::SetBytes(char* bytes, size_t length) { |
SetLength(static_cast<uint16_t>(length)); |
} |
+const uint16_t StunErrorCodeAttribute::MIN_SIZE = 4; |
+ |
StunErrorCodeAttribute::StunErrorCodeAttribute(uint16_t type, |
int code, |
const std::string& reason) |