summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/renderer_host/pepper_message_filter.cc26
-rw-r--r--ppapi/api/private/ppb_flash_net_address.idl61
-rw-r--r--ppapi/api/private/ppb_flash_tcp_socket.idl10
-rw-r--r--ppapi/c/private/ppb_flash_net_address.h85
-rw-r--r--ppapi/c/private/ppb_flash_tcp_socket.h19
-rw-r--r--ppapi/c/private/ppb_flash_udp_socket.h4
-rw-r--r--ppapi/cpp/private/flash_net_address.cc81
-rw-r--r--ppapi/cpp/private/flash_net_address.h38
-rw-r--r--ppapi/ppapi_shared.gypi2
-rw-r--r--ppapi/proxy/interface_list.cc1
-rw-r--r--ppapi/shared_impl/private/DEPS3
-rw-r--r--ppapi/shared_impl/private/flash_net_address_impl.cc175
-rw-r--r--ppapi/shared_impl/private/flash_net_address_impl.h25
-rw-r--r--ppapi/thunk/interfaces_ppb_private.h1
14 files changed, 481 insertions, 50 deletions
diff --git a/content/browser/renderer_host/pepper_message_filter.cc b/content/browser/renderer_host/pepper_message_filter.cc
index a04162f..3a37d80 100644
--- a/content/browser/renderer_host/pepper_message_filter.cc
+++ b/content/browser/renderer_host/pepper_message_filter.cc
@@ -43,6 +43,7 @@
#include "ppapi/c/private/ppb_flash_net_connector.h"
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/proxy/ppb_flash_tcp_socket_proxy.h"
+#include "ppapi/shared_impl/private/flash_net_address_impl.h"
#include "webkit/plugins/ppapi/ppb_flash_net_connector_impl.h"
#if defined(ENABLE_FLAPPER_HACKS)
@@ -54,25 +55,7 @@ using content::BrowserThread;
namespace {
-bool ValidateNetAddress(const PP_Flash_NetAddress& addr) {
- if (addr.size < sizeof(reinterpret_cast<sockaddr*>(0)->sa_family))
- return false;
-
- // TODO(viettrungluu): more careful validation?
- // Just do a size check for AF_INET.
- if (reinterpret_cast<const sockaddr*>(addr.data)->sa_family == AF_INET &&
- addr.size >= sizeof(sockaddr_in))
- return true;
-
- // Ditto for AF_INET6.
- if (reinterpret_cast<const sockaddr*>(addr.data)->sa_family == AF_INET6 &&
- addr.size >= sizeof(sockaddr_in6))
- return true;
-
- // Reject everything else.
- return false;
-}
-
+// TODO(viettrungluu): Move (some of) these to flash_net_address_impl.h.
bool SockaddrToNetAddress(const sockaddr* sa,
socklen_t sa_length,
PP_Flash_NetAddress* net_addr) {
@@ -105,7 +88,8 @@ bool AddressListToNetAddress(const net::AddressList& address_list,
bool NetAddressToIPEndPoint(const PP_Flash_NetAddress& net_addr,
net::IPEndPoint* ip_end_point) {
- if (!ip_end_point || !ValidateNetAddress(net_addr))
+ if (!ip_end_point ||
+ !ppapi::FlashNetAddressImpl::ValidateNetAddress(net_addr))
return false;
if (!ip_end_point->FromSockAddr(
@@ -1105,7 +1089,7 @@ void PepperMessageFilter::OnConnectTcpAddress(int routing_id,
// Validate the address and then continue (doing |connect()|) on a worker
// thread.
- if (!ValidateNetAddress(addr) ||
+ if (!ppapi::FlashNetAddressImpl::ValidateNetAddress(addr) ||
!base::WorkerPool::PostTask(FROM_HERE,
NewRunnableMethod(
this,
diff --git a/ppapi/api/private/ppb_flash_net_address.idl b/ppapi/api/private/ppb_flash_net_address.idl
new file mode 100644
index 0000000..012c024
--- /dev/null
+++ b/ppapi/api/private/ppb_flash_net_address.idl
@@ -0,0 +1,61 @@
+/* Copyright (c) 2011 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/**
+ * This file defines the <code>PPB_Flash_NetAddress</code> interface.
+ */
+
+label Chrome {
+ M17 = 0.1
+};
+
+/**
+ * This is an opaque type holding a network address.
+ */
+[assert_size(132)]
+struct PP_Flash_NetAddress {
+ uint32_t size;
+ char[128] data;
+};
+
+/**
+ * The <code>PPB_Flash_NetAddress</code> interface provides operations on
+ * network addresses.
+ */
+interface PPB_Flash_NetAddress {
+ /**
+ * Returns PP_TRUE if the two addresses are equal (host and port).
+ */
+ PP_Bool AreEqual([in] PP_Flash_NetAddress addr1,
+ [in] PP_Flash_NetAddress addr2);
+
+ /**
+ * Returns PP_TRUE if the two addresses refer to the same host.
+ */
+ PP_Bool AreHostsEqual([in] PP_Flash_NetAddress addr1,
+ [in] PP_Flash_NetAddress addr2);
+
+ /**
+ * Returns a human-readable description of the network address, optionally
+ * including the port (e.g., "192.168.0.1", "192.168.0.1:99", or "[::1]:80"),
+ * or an undefined var on failure.
+ */
+ PP_Var Describe([in] PP_Module module,
+ [in] PP_Flash_NetAddress addr,
+ [in] PP_Bool include_port);
+
+ /**
+ * Replaces the port in the given source address. Returns PP_TRUE on success.
+ */
+ PP_Bool ReplacePort([in] PP_Flash_NetAddress src_addr,
+ [in] uint16_t port,
+ [out] PP_Flash_NetAddress dest_addr);
+
+ /**
+ * Gets the "any" address (for IPv4 or IPv6); for use with UDP Bind.
+ */
+ void GetAnyAddress([in] PP_Bool is_ipv6,
+ [out] PP_Flash_NetAddress addr);
+};
diff --git a/ppapi/api/private/ppb_flash_tcp_socket.idl b/ppapi/api/private/ppb_flash_tcp_socket.idl
index 7a8c4ca..e832809 100644
--- a/ppapi/api/private/ppb_flash_tcp_socket.idl
+++ b/ppapi/api/private/ppb_flash_tcp_socket.idl
@@ -12,15 +12,6 @@ label Chrome {
};
/**
- * This is an opaque type holding a network address.
- */
-[assert_size(132)]
-struct PP_Flash_NetAddress {
- uint32_t size;
- char[128] data;
-};
-
-/**
* The <code>PPB_Flash_TCPSocket</code> interface provides TCP socket
* operations.
*/
@@ -121,4 +112,3 @@ interface PPB_Flash_TCPSocket {
*/
void Disconnect([in] PP_Resource tcp_socket);
};
-
diff --git a/ppapi/c/private/ppb_flash_net_address.h b/ppapi/c/private/ppb_flash_net_address.h
new file mode 100644
index 0000000..20b2ac9
--- /dev/null
+++ b/ppapi/c/private/ppb_flash_net_address.h
@@ -0,0 +1,85 @@
+/* Copyright (c) 2011 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* From private/ppb_flash_net_address.idl modified Fri Nov 4 12:47:53 2011. */
+
+#ifndef PPAPI_C_PRIVATE_PPB_FLASH_NET_ADDRESS_H_
+#define PPAPI_C_PRIVATE_PPB_FLASH_NET_ADDRESS_H_
+
+#include "ppapi/c/pp_bool.h"
+#include "ppapi/c/pp_macros.h"
+#include "ppapi/c/pp_module.h"
+#include "ppapi/c/pp_stdint.h"
+#include "ppapi/c/pp_var.h"
+
+#define PPB_FLASH_NETADDRESS_INTERFACE_0_1 "PPB_Flash_NetAddress;0.1"
+#define PPB_FLASH_NETADDRESS_INTERFACE PPB_FLASH_NETADDRESS_INTERFACE_0_1
+
+/**
+ * @file
+ * This file defines the <code>PPB_Flash_NetAddress</code> interface.
+ */
+
+
+/**
+ * @addtogroup Structs
+ * @{
+ */
+/**
+ * This is an opaque type holding a network address.
+ */
+struct PP_Flash_NetAddress {
+ uint32_t size;
+ char data[128];
+};
+PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_Flash_NetAddress, 132);
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup Interfaces
+ * @{
+ */
+/**
+ * The <code>PPB_Flash_NetAddress</code> interface provides operations on
+ * network addresses.
+ */
+struct PPB_Flash_NetAddress {
+ /**
+ * Returns PP_TRUE if the two addresses are equal (host and port).
+ */
+ PP_Bool (*AreEqual)(const struct PP_Flash_NetAddress* addr1,
+ const struct PP_Flash_NetAddress* addr2);
+ /**
+ * Returns PP_TRUE if the two addresses refer to the same host.
+ */
+ PP_Bool (*AreHostsEqual)(const struct PP_Flash_NetAddress* addr1,
+ const struct PP_Flash_NetAddress* addr2);
+ /**
+ * Returns a human-readable description of the network address, optionally
+ * including the port (e.g., "192.168.0.1", "192.168.0.1:99", or "[::1]:80"),
+ * or an undefined var on failure.
+ */
+ struct PP_Var (*Describe)(PP_Module module,
+ const struct PP_Flash_NetAddress* addr,
+ PP_Bool include_port);
+ /**
+ * Replaces the port in the given source address. Returns PP_TRUE on success.
+ */
+ PP_Bool (*ReplacePort)(const struct PP_Flash_NetAddress* src_addr,
+ uint16_t port,
+ struct PP_Flash_NetAddress* dest_addr);
+ /**
+ * Gets the "any" address (for IPv4 or IPv6); for use with UDP Bind.
+ */
+ void (*GetAnyAddress)(PP_Bool is_ipv6, struct PP_Flash_NetAddress* addr);
+};
+/**
+ * @}
+ */
+
+#endif /* PPAPI_C_PRIVATE_PPB_FLASH_NET_ADDRESS_H_ */
+
diff --git a/ppapi/c/private/ppb_flash_tcp_socket.h b/ppapi/c/private/ppb_flash_tcp_socket.h
index 0cad5bc..cf75df9 100644
--- a/ppapi/c/private/ppb_flash_tcp_socket.h
+++ b/ppapi/c/private/ppb_flash_tcp_socket.h
@@ -3,7 +3,7 @@
* found in the LICENSE file.
*/
-/* From private/ppb_flash_tcp_socket.idl modified Fri Sep 23 17:09:42 2011. */
+/* From private/ppb_flash_tcp_socket.idl modified Mon Oct 17 16:09:17 2011. */
#ifndef PPAPI_C_PRIVATE_PPB_FLASH_TCP_SOCKET_H_
#define PPAPI_C_PRIVATE_PPB_FLASH_TCP_SOCKET_H_
@@ -14,6 +14,7 @@
#include "ppapi/c/pp_macros.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_stdint.h"
+#include "ppapi/c/private/ppb_flash_net_address.h"
#define PPB_FLASH_TCPSOCKET_INTERFACE_0_2 "PPB_Flash_TCPSocket;0.2"
#define PPB_FLASH_TCPSOCKET_INTERFACE PPB_FLASH_TCPSOCKET_INTERFACE_0_2
@@ -25,22 +26,6 @@
/**
- * @addtogroup Structs
- * @{
- */
-/**
- * This is an opaque type holding a network address.
- */
-struct PP_Flash_NetAddress {
- uint32_t size;
- char data[128];
-};
-PP_COMPILE_ASSERT_STRUCT_SIZE_IN_BYTES(PP_Flash_NetAddress, 132);
-/**
- * @}
- */
-
-/**
* @addtogroup Interfaces
* @{
*/
diff --git a/ppapi/c/private/ppb_flash_udp_socket.h b/ppapi/c/private/ppb_flash_udp_socket.h
index 0909363..b7fc66e 100644
--- a/ppapi/c/private/ppb_flash_udp_socket.h
+++ b/ppapi/c/private/ppb_flash_udp_socket.h
@@ -3,7 +3,7 @@
* found in the LICENSE file.
*/
-/* From ppb_flash_udp_socket.idl modified Mon Sep 26 09:04:41 2011. */
+/* From private/ppb_flash_udp_socket.idl modified Mon Oct 17 15:55:01 2011. */
#ifndef PPAPI_C_PRIVATE_PPB_FLASH_UDP_SOCKET_H_
#define PPAPI_C_PRIVATE_PPB_FLASH_UDP_SOCKET_H_
@@ -14,7 +14,7 @@
#include "ppapi/c/pp_macros.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_stdint.h"
-#include "ppapi/c/private/ppb_flash_tcp_socket.h"
+#include "ppapi/c/private/ppb_flash_net_address.h"
#define PPB_FLASH_UDPSOCKET_INTERFACE_0_1 "PPB_Flash_UDPSocket;0.1"
#define PPB_FLASH_UDPSOCKET_INTERFACE PPB_FLASH_UDPSOCKET_INTERFACE_0_1
diff --git a/ppapi/cpp/private/flash_net_address.cc b/ppapi/cpp/private/flash_net_address.cc
new file mode 100644
index 0000000..93984d7
--- /dev/null
+++ b/ppapi/cpp/private/flash_net_address.cc
@@ -0,0 +1,81 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// TODO(viettrungluu): See the comment in corresponding .h file.
+
+#include "ppapi/cpp/private/flash_net_address.h"
+
+#include "ppapi/c/pp_bool.h"
+#include "ppapi/cpp/module.h"
+#include "ppapi/cpp/module_impl.h"
+#include "ppapi/cpp/var.h"
+#include "ppapi/c/private/ppb_flash_net_address.h"
+
+namespace pp {
+
+namespace {
+
+template <> const char* interface_name<PPB_Flash_NetAddress>() {
+ return PPB_FLASH_NETADDRESS_INTERFACE;
+}
+
+} // namespace
+
+namespace flash {
+
+// static
+bool NetAddress::AreEqual(const PP_Flash_NetAddress& addr1,
+ const PP_Flash_NetAddress& addr2) {
+ if (!has_interface<PPB_Flash_NetAddress>())
+ return false;
+ return !!get_interface<PPB_Flash_NetAddress>()->AreEqual(&addr1, &addr2);
+}
+
+// static
+bool NetAddress::AreHostsEqual(const PP_Flash_NetAddress& addr1,
+ const PP_Flash_NetAddress& addr2) {
+ if (!has_interface<PPB_Flash_NetAddress>())
+ return false;
+ return !!get_interface<PPB_Flash_NetAddress>()->AreHostsEqual(&addr1, &addr2);
+}
+
+// static
+std::string NetAddress::Describe(const PP_Flash_NetAddress& addr,
+ bool include_port) {
+ if (!has_interface<PPB_Flash_NetAddress>())
+ return std::string();
+
+ Module* module = Module::Get();
+ if (!module)
+ return std::string();
+
+ Var result(Var::PassRef(),
+ get_interface<PPB_Flash_NetAddress>()->Describe(
+ module->pp_module(),
+ &addr,
+ PP_FromBool(include_port)));
+ return result.is_string() ? result.AsString() : std::string();
+}
+
+// static
+bool NetAddress::ReplacePort(const PP_Flash_NetAddress& addr_in,
+ uint16_t port,
+ PP_Flash_NetAddress* addr_out) {
+ if (!has_interface<PPB_Flash_NetAddress>())
+ return false;
+ return !!get_interface<PPB_Flash_NetAddress>()->ReplacePort(&addr_in,
+ port,
+ addr_out);
+}
+
+// static
+void NetAddress::GetAnyAddress(bool is_ipv6, PP_Flash_NetAddress* addr) {
+ if (!has_interface<PPB_Flash_NetAddress>())
+ return;
+ get_interface<PPB_Flash_NetAddress>()->GetAnyAddress(PP_FromBool(is_ipv6),
+ addr);
+}
+
+} // namespace flash
+} // namespace pp
diff --git a/ppapi/cpp/private/flash_net_address.h b/ppapi/cpp/private/flash_net_address.h
new file mode 100644
index 0000000..f08cb52
--- /dev/null
+++ b/ppapi/cpp/private/flash_net_address.h
@@ -0,0 +1,38 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// TODO(viettrungluu): This (and the .cc file) contain C++ wrappers for things
+// in ppapi/c/private/ppb_flash_net_address.h. This is currently not used in
+// (or even compiled with) Chromium.
+
+#ifndef PPAPI_CPP_PRIVATE_FLASH_NET_ADDRESS_H_
+#define PPAPI_CPP_PRIVATE_FLASH_NET_ADDRESS_H_
+
+#include <string>
+
+#include "ppapi/c/pp_stdint.h"
+
+struct PP_Flash_NetAddress;
+
+namespace pp {
+namespace flash {
+
+class NetAddress {
+ public:
+ static bool AreEqual(const PP_Flash_NetAddress& addr1,
+ const PP_Flash_NetAddress& addr2);
+ static bool AreHostsEqual(const PP_Flash_NetAddress& addr1,
+ const PP_Flash_NetAddress& addr2);
+ static std::string Describe(const PP_Flash_NetAddress& addr,
+ bool include_port);
+ static bool ReplacePort(const PP_Flash_NetAddress& addr_in,
+ uint16_t port,
+ PP_Flash_NetAddress* addr_out);
+ static void GetAnyAddress(bool is_ipv6, PP_Flash_NetAddress* addr);
+};
+
+} // namespace flash
+} // namespace pp
+
+#endif // PPAPI_CPP_PRIVATE_FLASH_NET_ADDRESS_H_
diff --git a/ppapi/ppapi_shared.gypi b/ppapi/ppapi_shared.gypi
index 021a09e..f74c886 100644
--- a/ppapi/ppapi_shared.gypi
+++ b/ppapi/ppapi_shared.gypi
@@ -63,6 +63,8 @@
'shared_impl/ppapi_preferences.h',
'shared_impl/ppp_instance_combined.cc',
'shared_impl/ppp_instance_combined.h',
+ # TODO(viettrungluu): Split this out; it won't be used in NaCl.
+ 'shared_impl/private/flash_net_address_impl.cc',
'shared_impl/proxy_lock.cc',
'shared_impl/proxy_lock.h',
'shared_impl/resource.cc',
diff --git a/ppapi/proxy/interface_list.cc b/ppapi/proxy/interface_list.cc
index a11e778..269aa6e 100644
--- a/ppapi/proxy/interface_list.cc
+++ b/ppapi/proxy/interface_list.cc
@@ -46,6 +46,7 @@
#include "ppapi/c/private/ppb_flash_file.h"
#include "ppapi/c/private/ppb_flash_fullscreen.h"
#include "ppapi/c/private/ppb_flash_menu.h"
+#include "ppapi/c/private/ppb_flash_net_address.h"
#include "ppapi/c/private/ppb_flash_net_connector.h"
#include "ppapi/c/private/ppb_flash_tcp_socket.h"
#include "ppapi/c/private/ppb_flash_udp_socket.h"
diff --git a/ppapi/shared_impl/private/DEPS b/ppapi/shared_impl/private/DEPS
new file mode 100644
index 0000000..6a2f02e
--- /dev/null
+++ b/ppapi/shared_impl/private/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+ "+net/base",
+]
diff --git a/ppapi/shared_impl/private/flash_net_address_impl.cc b/ppapi/shared_impl/private/flash_net_address_impl.cc
new file mode 100644
index 0000000..0fd0d0fb
--- /dev/null
+++ b/ppapi/shared_impl/private/flash_net_address_impl.cc
@@ -0,0 +1,175 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ppapi/shared_impl/private/flash_net_address_impl.h"
+
+#include <string.h>
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "build/build_config.h"
+#include "net/base/net_util.h"
+#include "net/base/sys_addrinfo.h"
+#include "net/base/sys_byteorder.h"
+#include "ppapi/c/pp_var.h"
+#include "ppapi/c/private/ppb_flash_net_address.h"
+#include "ppapi/shared_impl/var.h"
+#include "ppapi/thunk/thunk.h"
+
+// The Flash net address interface doesn't have a normal C -> C++ thunk since it
+// doesn't actually have any proxy wrapping or associated objects; it's just a
+// call into base. So we implement the entire interface here, using the thunk
+// namespace so it magically gets hooked up in the proper places.
+
+namespace ppapi {
+
+namespace {
+
+#if defined(OS_WIN)
+// The type of |sockaddr::sa_family|.
+typedef ADDRESS_FAMILY sa_family_t;
+#endif
+
+inline sa_family_t GetFamily(const PP_Flash_NetAddress& addr) {
+ return reinterpret_cast<const sockaddr*>(addr.data)->sa_family;
+}
+
+PP_Bool AreHostsEqual(const PP_Flash_NetAddress* addr1,
+ const PP_Flash_NetAddress* addr2) {
+ if (!FlashNetAddressImpl::ValidateNetAddress(*addr1) ||
+ !FlashNetAddressImpl::ValidateNetAddress(*addr2))
+ return PP_FALSE;
+
+ if (GetFamily(*addr1) != GetFamily(*addr2))
+ return PP_FALSE;
+
+ if (GetFamily(*addr1) == AF_INET) {
+ const sockaddr_in* a1 = reinterpret_cast<const sockaddr_in*>(addr1->data);
+ const sockaddr_in* a2 = reinterpret_cast<const sockaddr_in*>(addr2->data);
+ return PP_FromBool(a1->sin_addr.s_addr == a2->sin_addr.s_addr);
+ }
+
+ if (GetFamily(*addr1) == AF_INET6) {
+ const sockaddr_in6* a1 = reinterpret_cast<const sockaddr_in6*>(addr1->data);
+ const sockaddr_in6* a2 = reinterpret_cast<const sockaddr_in6*>(addr2->data);
+ return PP_FromBool(a1->sin6_flowinfo == a2->sin6_flowinfo &&
+ memcmp(&a1->sin6_addr, &a2->sin6_addr,
+ sizeof(a1->sin6_addr)) == 0 &&
+ a1->sin6_scope_id == a2->sin6_scope_id);
+ }
+
+ return PP_FALSE;
+}
+
+PP_Bool AreEqual(const PP_Flash_NetAddress* addr1,
+ const PP_Flash_NetAddress* addr2) {
+ // |AreHostsEqual()| will also validate the addresses and return false if
+ // either is invalid.
+ if (!AreHostsEqual(addr1, addr2))
+ return PP_FALSE;
+
+ // Note: Here, we know that |addr1| and |addr2| have the same family.
+ if (GetFamily(*addr1) == AF_INET) {
+ const sockaddr_in* a1 = reinterpret_cast<const sockaddr_in*>(addr1->data);
+ const sockaddr_in* a2 = reinterpret_cast<const sockaddr_in*>(addr2->data);
+ return PP_FromBool(a1->sin_port == a2->sin_port);
+ }
+
+ if (GetFamily(*addr1) == AF_INET6) {
+ const sockaddr_in6* a1 = reinterpret_cast<const sockaddr_in6*>(addr1->data);
+ const sockaddr_in6* a2 = reinterpret_cast<const sockaddr_in6*>(addr2->data);
+ return PP_FromBool(a1->sin6_port == a2->sin6_port);
+ }
+
+ return PP_FALSE;
+}
+
+PP_Var Describe(PP_Module module,
+ const struct PP_Flash_NetAddress* addr,
+ PP_Bool include_port) {
+ if (!FlashNetAddressImpl::ValidateNetAddress(*addr))
+ return PP_MakeUndefined();
+
+ const sockaddr* a = reinterpret_cast<const sockaddr*>(addr->data);
+ socklen_t l = addr->size;
+ std::string description =
+ include_port ? net::NetAddressToStringWithPort(a, l) :
+ net::NetAddressToString(a, l);
+ return StringVar::StringToPPVar(module, description);
+}
+
+PP_Bool ReplacePort(const struct PP_Flash_NetAddress* src_addr,
+ uint16_t port,
+ struct PP_Flash_NetAddress* dest_addr) {
+ if (!FlashNetAddressImpl::ValidateNetAddress(*src_addr))
+ return PP_FALSE;
+
+ if (GetFamily(*src_addr) == AF_INET) {
+ memmove(dest_addr, src_addr, sizeof(*src_addr));
+ reinterpret_cast<sockaddr_in*>(dest_addr->data)->sin_port = htons(port);
+ return PP_TRUE;
+ }
+
+ if (GetFamily(*src_addr) == AF_INET6) {
+ memmove(dest_addr, src_addr, sizeof(*src_addr));
+ reinterpret_cast<sockaddr_in6*>(dest_addr->data)->sin6_port = htons(port);
+ return PP_TRUE;
+ }
+
+ return PP_FALSE;
+}
+
+void GetAnyAddress(PP_Bool is_ipv6, struct PP_Flash_NetAddress* addr) {
+ memset(addr->data, 0, arraysize(addr->data) * sizeof(addr->data[0]));
+ if (is_ipv6) {
+ sockaddr_in6* a = reinterpret_cast<sockaddr_in6*>(addr->data);
+ addr->size = sizeof(*a);
+ a->sin6_family = AF_INET6;
+ a->sin6_addr = in6addr_any;
+ } else {
+ sockaddr_in* a = reinterpret_cast<sockaddr_in*>(addr->data);
+ addr->size = sizeof(*a);
+ a->sin_family = AF_INET;
+ a->sin_addr.s_addr = INADDR_ANY;
+ }
+}
+
+const PPB_Flash_NetAddress flash_net_address_interface = {
+ &AreEqual,
+ &AreHostsEqual,
+ &Describe,
+ &ReplacePort,
+ &GetAnyAddress
+};
+
+} // namespace
+
+namespace thunk {
+
+PPAPI_THUNK_EXPORT const PPB_Flash_NetAddress* GetPPB_Flash_NetAddress_Thunk() {
+ return &flash_net_address_interface;
+}
+
+} // namespace thunk
+
+// static
+bool FlashNetAddressImpl::ValidateNetAddress(const PP_Flash_NetAddress& addr) {
+ if (addr.size < sizeof(reinterpret_cast<sockaddr*>(0)->sa_family))
+ return false;
+
+ // TODO(viettrungluu): more careful validation?
+ // Just do a size check for AF_INET.
+ if (GetFamily(addr) == AF_INET && addr.size >= sizeof(sockaddr_in))
+ return true;
+
+ // Ditto for AF_INET6.
+ if (GetFamily(addr) == AF_INET6 && addr.size >= sizeof(sockaddr_in6))
+ return true;
+
+ // Reject everything else.
+ return false;
+}
+
+} // namespace ppapi
diff --git a/ppapi/shared_impl/private/flash_net_address_impl.h b/ppapi/shared_impl/private/flash_net_address_impl.h
new file mode 100644
index 0000000..6c070af
--- /dev/null
+++ b/ppapi/shared_impl/private/flash_net_address_impl.h
@@ -0,0 +1,25 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef PPAPI_SHARED_IMPL_PRIVATE_FLASH_NET_ADDRESS_IMPL_H_
+#define PPAPI_SHARED_IMPL_PRIVATE_FLASH_NET_ADDRESS_IMPL_H_
+
+#include "base/basictypes.h"
+#include "ppapi/shared_impl/ppapi_shared_export.h"
+
+struct PP_Flash_NetAddress;
+
+namespace ppapi {
+
+class PPAPI_SHARED_EXPORT FlashNetAddressImpl {
+ public:
+ static bool ValidateNetAddress(const PP_Flash_NetAddress& addr);
+
+ private:
+ DISALLOW_IMPLICIT_CONSTRUCTORS(FlashNetAddressImpl);
+};
+
+} // namespace ppapi
+
+#endif // PPAPI_SHARED_IMPL_PRIVATE_FLASH_NET_ADDRESS_IMPL_H_
diff --git a/ppapi/thunk/interfaces_ppb_private.h b/ppapi/thunk/interfaces_ppb_private.h
index 2631552..f6d5397 100644
--- a/ppapi/thunk/interfaces_ppb_private.h
+++ b/ppapi/thunk/interfaces_ppb_private.h
@@ -11,6 +11,7 @@ PROXIED_API(PPB_Broker)
PROXIED_IFACE(PPB_Broker, PPB_BROKER_TRUSTED_INTERFACE_0_2, PPB_BrokerTrusted)
PROXIED_IFACE(PPB_Instance, PPB_FLASHFULLSCREEN_INTERFACE, PPB_FlashFullscreen)
+PROXIED_IFACE(NoAPIName, PPB_FLASH_NETADDRESS_INTERFACE, PPB_Flash_NetAddress)
// Map the old fullscreen interface string to the Flash one, which is the same
// at the ABI level. TODO(polina): remove this when Flash is updated.
PROXIED_IFACE(PPB_Instance, PPB_FULLSCREEN_DEV_INTERFACE_0_4,