Index: webrtc/base/firewallsocketserver.cc |
diff --git a/webrtc/base/firewallsocketserver.cc b/webrtc/base/firewallsocketserver.cc |
index 30e5c3bfaa8c14a6cc4b9edaff4610763bd96d8a..4a2a4048f37684bc4c2e0cc7838e984cf0269ee9 100644 |
--- a/webrtc/base/firewallsocketserver.cc |
+++ b/webrtc/base/firewallsocketserver.cc |
@@ -24,6 +24,14 @@ class FirewallSocket : public AsyncSocketAdapter { |
: AsyncSocketAdapter(socket), server_(server), type_(type) { |
} |
+ int Bind(const SocketAddress& addr) override { |
+ if (!server_->IsBindableIp(addr.ipaddr())) { |
+ SetError(EINVAL); |
+ return SOCKET_ERROR; |
+ } |
+ return AsyncSocketAdapter::Bind(addr); |
+ } |
+ |
int Connect(const SocketAddress& addr) override { |
if (type_ == SOCK_STREAM) { |
if (!server_->Check(FP_TCP, GetLocalAddress(), addr)) { |
@@ -176,6 +184,16 @@ bool FirewallSocketServer::Check(FirewallProtocol p, |
return true; |
} |
+void FirewallSocketServer::SetUnbindableIps( |
+ const std::vector<rtc::IPAddress>& unbindable_ips) { |
+ unbindable_ips_ = unbindable_ips; |
+} |
+ |
+bool FirewallSocketServer::IsBindableIp(const rtc::IPAddress& ip) { |
+ return std::find(unbindable_ips_.begin(), unbindable_ips_.end(), ip) == |
+ unbindable_ips_.end(); |
+} |
+ |
Socket* FirewallSocketServer::CreateSocket(int type) { |
return CreateSocket(AF_INET, type); |
} |