diff --git a/webrtc/p2p/base/port.cc b/webrtc/p2p/base/port.cc index ed26fe494c..a630695b05 100644 --- a/webrtc/p2p/base/port.cc +++ b/webrtc/p2p/base/port.cc @@ -288,7 +288,7 @@ void Port::OnReadPacket( // send back a proper binding response. rtc::scoped_ptr msg; std::string remote_username; - if (!GetStunMessage(data, size, addr, msg.accept(), &remote_username)) { + if (!GetStunMessage(data, size, addr, &msg, &remote_username)) { LOG_J(LS_ERROR, this) << "Received non-STUN packet from unknown address (" << addr.ToSensitiveString() << ")"; } else if (!msg) { @@ -330,15 +330,16 @@ size_t Port::AddPrflxCandidate(const Candidate& local) { return (candidates_.size() - 1); } -bool Port::GetStunMessage(const char* data, size_t size, +bool Port::GetStunMessage(const char* data, + size_t size, const rtc::SocketAddress& addr, - IceMessage** out_msg, std::string* out_username) { + rtc::scoped_ptr* out_msg, + std::string* out_username) { // NOTE: This could clearly be optimized to avoid allocating any memory. // However, at the data rates we'll be looking at on the client side, // this probably isn't worth worrying about. ASSERT(out_msg != NULL); ASSERT(out_username != NULL); - *out_msg = NULL; out_username->clear(); // Don't bother parsing the packet if we can tell it's not STUN. @@ -422,7 +423,7 @@ bool Port::GetStunMessage(const char* data, size_t size, } // Return the STUN message found. - *out_msg = stun_msg.release(); + *out_msg = std::move(stun_msg); return true; } @@ -902,7 +903,7 @@ void Connection::OnReadPacket( rtc::scoped_ptr msg; std::string remote_ufrag; const rtc::SocketAddress& addr(remote_candidate_.address()); - if (!port_->GetStunMessage(data, size, addr, msg.accept(), &remote_ufrag)) { + if (!port_->GetStunMessage(data, size, addr, &msg, &remote_ufrag)) { // The packet did not parse as a valid STUN message // This is a data packet, pass it along. set_receiving(true); diff --git a/webrtc/p2p/base/port.h b/webrtc/p2p/base/port.h index 75b786fd0c..84600d10ef 100644 --- a/webrtc/p2p/base/port.h +++ b/webrtc/p2p/base/port.h @@ -332,9 +332,11 @@ class Port : public PortInterface, public rtc::MessageHandler, // with this port's username fragment, msg will contain the parsed STUN // message. Otherwise, the function may send a STUN response internally. // remote_username contains the remote fragment of the STUN username. - bool GetStunMessage(const char* data, size_t size, + bool GetStunMessage(const char* data, + size_t size, const rtc::SocketAddress& addr, - IceMessage** out_msg, std::string* out_username); + rtc::scoped_ptr* out_msg, + std::string* out_username); // Checks if the address in addr is compatible with the port's ip. bool IsCompatibleAddress(const rtc::SocketAddress& addr); diff --git a/webrtc/p2p/base/port_unittest.cc b/webrtc/p2p/base/port_unittest.cc index 4caa326a85..c47ceaa98d 100644 --- a/webrtc/p2p/base/port_unittest.cc +++ b/webrtc/p2p/base/port_unittest.cc @@ -1775,8 +1775,8 @@ TEST_F(PortTest, TestHandleStunMessage) { in_msg->AddMessageIntegrity("rpass"); in_msg->AddFingerprint(); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_TRUE(out_msg.get() != NULL); EXPECT_EQ("lfrag", username); @@ -1787,8 +1787,8 @@ TEST_F(PortTest, TestHandleStunMessage) { in_msg->AddMessageIntegrity("rpass"); in_msg->AddFingerprint(); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_TRUE(out_msg.get() != NULL); EXPECT_EQ("", username); @@ -1798,8 +1798,8 @@ TEST_F(PortTest, TestHandleStunMessage) { STUN_ERROR_SERVER_ERROR, STUN_ERROR_REASON_SERVER_ERROR)); in_msg->AddFingerprint(); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_TRUE(out_msg.get() != NULL); EXPECT_EQ("", username); ASSERT_TRUE(out_msg->GetErrorCode() != NULL); @@ -1823,8 +1823,8 @@ TEST_F(PortTest, TestHandleStunMessageBadUsername) { in_msg->AddMessageIntegrity("rpass"); in_msg->AddFingerprint(); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_TRUE(out_msg.get() == NULL); EXPECT_EQ("", username); EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code()); @@ -1834,8 +1834,8 @@ TEST_F(PortTest, TestHandleStunMessageBadUsername) { in_msg->AddMessageIntegrity("rpass"); in_msg->AddFingerprint(); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_TRUE(out_msg.get() == NULL); EXPECT_EQ("", username); EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); @@ -1845,8 +1845,8 @@ TEST_F(PortTest, TestHandleStunMessageBadUsername) { in_msg->AddMessageIntegrity("rpass"); in_msg->AddFingerprint(); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_TRUE(out_msg.get() == NULL); EXPECT_EQ("", username); EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); @@ -1857,8 +1857,8 @@ TEST_F(PortTest, TestHandleStunMessageBadUsername) { in_msg->AddMessageIntegrity("rpass"); in_msg->AddFingerprint(); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_TRUE(out_msg.get() == NULL); EXPECT_EQ("", username); EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); @@ -1869,8 +1869,8 @@ TEST_F(PortTest, TestHandleStunMessageBadUsername) { in_msg->AddMessageIntegrity("rpass"); in_msg->AddFingerprint(); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_TRUE(out_msg.get() == NULL); EXPECT_EQ("", username); EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); @@ -1893,8 +1893,8 @@ TEST_F(PortTest, TestHandleStunMessageBadMessageIntegrity) { "rfrag:lfrag")); in_msg->AddFingerprint(); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_TRUE(out_msg.get() == NULL); EXPECT_EQ("", username); EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code()); @@ -1906,8 +1906,8 @@ TEST_F(PortTest, TestHandleStunMessageBadMessageIntegrity) { in_msg->AddMessageIntegrity("invalid"); in_msg->AddFingerprint(); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_TRUE(out_msg.get() == NULL); EXPECT_EQ("", username); EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); @@ -1934,16 +1934,16 @@ TEST_F(PortTest, TestHandleStunMessageBadFingerprint) { "rfrag:lfrag")); in_msg->AddMessageIntegrity("rpass"); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_EQ(0, port->last_stun_error_code()); // Now, add a fingerprint, but munge the message so it's not valid. in_msg->AddFingerprint(); in_msg->SetTransactionID("TESTTESTBADD"); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_EQ(0, port->last_stun_error_code()); // Valid BINDING-RESPONSE, except no FINGERPRINT. @@ -1952,16 +1952,16 @@ TEST_F(PortTest, TestHandleStunMessageBadFingerprint) { new StunXorAddressAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2)); in_msg->AddMessageIntegrity("rpass"); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_EQ(0, port->last_stun_error_code()); // Now, add a fingerprint, but munge the message so it's not valid. in_msg->AddFingerprint(); in_msg->SetTransactionID("TESTTESTBADD"); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_EQ(0, port->last_stun_error_code()); // Valid BINDING-ERROR-RESPONSE, except no FINGERPRINT. @@ -1970,16 +1970,16 @@ TEST_F(PortTest, TestHandleStunMessageBadFingerprint) { STUN_ERROR_SERVER_ERROR, STUN_ERROR_REASON_SERVER_ERROR)); in_msg->AddMessageIntegrity("rpass"); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_EQ(0, port->last_stun_error_code()); // Now, add a fingerprint, but munge the message so it's not valid. in_msg->AddFingerprint(); in_msg->SetTransactionID("TESTTESTBADD"); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_EQ(0, port->last_stun_error_code()); } @@ -2000,8 +2000,8 @@ TEST_F(PortTest, TestHandleStunBindingIndication) { in_msg.reset(CreateStunMessage(STUN_BINDING_INDICATION)); in_msg->AddFingerprint(); WriteStunMessage(in_msg.get(), buf.get()); - EXPECT_TRUE(lport->GetStunMessage(buf->Data(), buf->Length(), addr, - out_msg.accept(), &username)); + EXPECT_TRUE(lport->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg, + &username)); EXPECT_TRUE(out_msg.get() != NULL); EXPECT_EQ(out_msg->type(), STUN_BINDING_INDICATION); EXPECT_EQ("", username);