Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(560)

Unified Diff: content/browser/renderer_host/p2p_socket_host_udp.cc

Issue 6800023: Security restrictions for P2P UDP Sockets. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: - Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698