Chromium Code Reviews| Index: content/browser/renderer_host/p2p_socket_host_udp.cc |
| diff --git a/content/browser/renderer_host/p2p_socket_host_udp.cc b/content/browser/renderer_host/p2p_socket_host_udp.cc |
| index 9d9a0636bd6988a05fdc11e5a8b558b2c06c240d..5c2e0da698d15b10ed873ea9800164557a0d9c85 100644 |
| --- a/content/browser/renderer_host/p2p_socket_host_udp.cc |
| +++ b/content/browser/renderer_host/p2p_socket_host_udp.cc |
| @@ -4,7 +4,6 @@ |
| #include "content/browser/renderer_host/p2p_socket_host_udp.h" |
| -#include "content/browser/renderer_host/p2p_sockets_host.h" |
| #include "content/common/p2p_messages.h" |
| #include "net/base/io_buffer.h" |
| #include "net/base/net_errors.h" |
| @@ -12,13 +11,16 @@ |
| namespace { |
| +// UDP packets cannot be bigger than 64k. |
| const int kReadBufferSize = 65536; |
| } // namespace |
| -P2PSocketHostUdp::P2PSocketHostUdp(P2PSocketsHost* host, int routing_id, int id) |
| - : P2PSocketHost(host, routing_id, id), |
| +P2PSocketHostUdp::P2PSocketHostUdp(IPC::Message::Sender* message_sender, |
| + int routing_id, int id) |
|
Alpha Left Google
2011/04/09 00:44:32
nit: indentation.
Sergey Ulanov
2011/04/09 00:49:10
err, isn't it correct?
|
| + : P2PSocketHost(message_sender, routing_id, id), |
| state_(STATE_UNINITIALIZED), |
| + socket_(new net::UDPServerSocket(NULL, net::NetLog::Source())), |
| send_pending_(false), |
| ALLOW_THIS_IN_INITIALIZER_LIST( |
| recv_callback_(this, &P2PSocketHostUdp::OnRecv)), |
| @@ -34,9 +36,7 @@ P2PSocketHostUdp::~P2PSocketHostUdp() { |
| } |
| bool P2PSocketHostUdp::Init(const net::IPEndPoint& local_address) { |
| - net::UDPServerSocket* socket = new net::UDPServerSocket( |
| - NULL, net::NetLog::Source()); |
| - socket_.reset(socket); |
| + DCHECK_EQ(state_, STATE_UNINITIALIZED); |
| int result = socket_->Listen(local_address); |
| if (result < 0) { |
| @@ -61,7 +61,7 @@ bool P2PSocketHostUdp::Init(const net::IPEndPoint& local_address) { |
| recv_buffer_ = new net::IOBuffer(kReadBufferSize); |
| DoRead(); |
| - host_->Send(new P2PMsg_OnSocketCreated(routing_id_, id_, address)); |
| + message_sender_->Send(new P2PMsg_OnSocketCreated(routing_id_, id_, address)); |
| return true; |
| } |
| @@ -70,7 +70,7 @@ void P2PSocketHostUdp::OnError() { |
| socket_.reset(); |
| if (state_ == STATE_UNINITIALIZED || state_ == STATE_OPEN) |
| - host_->Send(new P2PMsg_OnError(routing_id_, id_)); |
| + message_sender_->Send(new P2PMsg_OnError(routing_id_, id_)); |
| state_ = STATE_ERROR; |
| } |
| @@ -96,15 +96,28 @@ void P2PSocketHostUdp::DidCompleteRead(int result) { |
| if (result > 0) { |
| std::vector<char> data(recv_buffer_->data(), recv_buffer_->data() + result); |
| - host_->Send(new P2PMsg_OnDataReceived(routing_id_, id_, |
| - recv_address_, data)); |
| + |
| + if (authorized_peers_.find(recv_address_) == authorized_peers_.end()) { |
|
Alpha Left Google
2011/04/09 00:44:32
Authorization based on peer seems to be enough. Ho
|
| + int type = GetStunPacketType(&*data.begin(), data.size()); |
| + if (type == STUN_BINDING_REQUEST || type == STUN_BINDING_RESPONSE) { |
| + authorized_peers_.insert(recv_address_); |
| + } else if (type != STUN_BINDING_ERROR) { |
| + LOG(ERROR) << "Received unexpected packet which is not a STUN binding " |
| + "request or response from " << recv_address_.ToString() |
| + << " before STUN binding is finished."; |
| + return; |
| + } |
| + } |
| + |
| + message_sender_->Send(new P2PMsg_OnDataReceived(routing_id_, id_, |
| + recv_address_, data)); |
| } else if (result < 0 && result != net::ERR_IO_PENDING) { |
| LOG(ERROR) << "Error when reading from UDP socket: " << result; |
| OnError(); |
| } |
| } |
| -void P2PSocketHostUdp::Send(const net::IPEndPoint& socket_address, |
| +void P2PSocketHostUdp::Send(const net::IPEndPoint& to, |
| const std::vector<char>& data) { |
| if (send_pending_) { |
| // Silently drop packet if previous send hasn't finished. |
| @@ -112,10 +125,21 @@ void P2PSocketHostUdp::Send(const net::IPEndPoint& socket_address, |
| return; |
| } |
| + if (authorized_peers_.find(to) == authorized_peers_.end()) { |
| + int type = GetStunPacketType(&*data.begin(), data.size()); |
| + if (type != STUN_BINDING_REQUEST && type != STUN_BINDING_RESPONSE && |
| + type != STUN_BINDING_ERROR) { |
| + LOG(ERROR) << "Page tried to send an UDP packet which is not a " |
| + "STUN message to " << to.ToString() |
| + << " before STUN binding is finished."; |
| + OnError(); |
| + return; |
| + } |
| + } |
| + |
| scoped_refptr<net::IOBuffer> buffer = new net::IOBuffer(data.size()); |
| memcpy(buffer->data(), &data.begin()[0], data.size()); |
| - int result = socket_->SendTo(buffer, data.size(), socket_address, |
| - &send_callback_); |
| + int result = socket_->SendTo(buffer, data.size(), to, &send_callback_); |
| if (result == net::ERR_IO_PENDING) { |
| send_pending_ = true; |
| } else if (result < 0) { |