Index: webrtc/p2p/base/turnport.cc |
diff --git a/webrtc/p2p/base/turnport.cc b/webrtc/p2p/base/turnport.cc |
index 9ea354c42cf259a7d00bc429930b05054145aa90..ae1fea2c8d1de43abd1e7b96595c471503bb2849 100644 |
--- a/webrtc/p2p/base/turnport.cc |
+++ b/webrtc/p2p/base/turnport.cc |
@@ -533,11 +533,15 @@ int TurnPort::SendTo(const void* data, size_t size, |
return static_cast<int>(size); |
} |
-void TurnPort::OnReadPacket( |
- rtc::AsyncPacketSocket* socket, const char* data, size_t size, |
- const rtc::SocketAddress& remote_addr, |
- const rtc::PacketTime& packet_time) { |
- ASSERT(socket == socket_); |
+bool TurnPort::HandleIncomingPacket(rtc::AsyncPacketSocket* socket, |
+ const char* data, size_t size, |
+ const rtc::SocketAddress& remote_addr, |
+ const rtc::PacketTime& packet_time) { |
+ if (socket != socket_) { |
+ // The packet was received on a shared socket after we've allocated a new |
+ // socket for this TURN port. |
+ return false; |
+ } |
// This is to guard against a STUN response from previous server after |
// alternative server redirection. TODO(guoweis): add a unit test for this |
@@ -547,19 +551,19 @@ void TurnPort::OnReadPacket( |
<< remote_addr.ToString() |
<< ", server_address_:" |
<< server_address_.address.ToString(); |
- return; |
+ return false; |
} |
// The message must be at least the size of a channel header. |
if (size < TURN_CHANNEL_HEADER_SIZE) { |
LOG_J(LS_WARNING, this) << "Received TURN message that was too short"; |
- return; |
+ return false; |
} |
if (state_ == STATE_DISCONNECTED) { |
LOG_J(LS_WARNING, this) |
<< "Received TURN message while the Turn port is disconnected"; |
- return; |
+ return false; |
} |
// Check the message type, to see if is a Channel Data message. |
@@ -568,27 +572,41 @@ void TurnPort::OnReadPacket( |
uint16_t msg_type = rtc::GetBE16(data); |
if (IsTurnChannelData(msg_type)) { |
HandleChannelData(msg_type, data, size, packet_time); |
- } else if (msg_type == TURN_DATA_INDICATION) { |
+ return true; |
+ |
+ } |
+ |
+ if (msg_type == TURN_DATA_INDICATION) { |
HandleDataIndication(data, size, packet_time); |
- } else { |
- if (SharedSocket() && |
- (msg_type == STUN_BINDING_RESPONSE || |
- msg_type == STUN_BINDING_ERROR_RESPONSE)) { |
- LOG_J(LS_VERBOSE, this) << |
- "Ignoring STUN binding response message on shared socket."; |
- return; |
- } |
+ return true; |
+ } |
- // This must be a response for one of our requests. |
- // Check success responses, but not errors, for MESSAGE-INTEGRITY. |
- if (IsStunSuccessResponseType(msg_type) && |
- !StunMessage::ValidateMessageIntegrity(data, size, hash())) { |
- LOG_J(LS_WARNING, this) << "Received TURN message with invalid " |
- << "message integrity, msg_type=" << msg_type; |
- return; |
- } |
- request_manager_.CheckResponse(data, size); |
+ if (SharedSocket() && (msg_type == STUN_BINDING_RESPONSE || |
+ msg_type == STUN_BINDING_ERROR_RESPONSE)) { |
+ LOG_J(LS_VERBOSE, this) << |
+ "Ignoring STUN binding response message on shared socket."; |
+ return false; |
} |
+ |
+ // This must be a response for one of our requests. |
+ // Check success responses, but not errors, for MESSAGE-INTEGRITY. |
+ if (IsStunSuccessResponseType(msg_type) && |
+ !StunMessage::ValidateMessageIntegrity(data, size, hash())) { |
+ LOG_J(LS_WARNING, this) << "Received TURN message with invalid " |
+ << "message integrity, msg_type=" << msg_type; |
+ return true; |
+ } |
+ request_manager_.CheckResponse(data, size); |
+ |
+ return true; |
+} |
+ |
+void TurnPort::OnReadPacket(rtc::AsyncPacketSocket* socket, |
+ const char* data, |
+ size_t size, |
+ const rtc::SocketAddress& remote_addr, |
+ const rtc::PacketTime& packet_time) { |
+ HandleIncomingPacket(socket, data, size, remote_addr, packet_time); |
} |
void TurnPort::OnSentPacket(rtc::AsyncPacketSocket* socket, |