diff options
-rw-r--r-- | content/browser/renderer_host/pepper_message_filter.cc | 26 | ||||
-rw-r--r-- | ppapi/api/private/ppb_flash_net_address.idl | 61 | ||||
-rw-r--r-- | ppapi/api/private/ppb_flash_tcp_socket.idl | 10 | ||||
-rw-r--r-- | ppapi/c/private/ppb_flash_net_address.h | 85 | ||||
-rw-r--r-- | ppapi/c/private/ppb_flash_tcp_socket.h | 19 | ||||
-rw-r--r-- | ppapi/c/private/ppb_flash_udp_socket.h | 4 | ||||
-rw-r--r-- | ppapi/cpp/private/flash_net_address.cc | 81 | ||||
-rw-r--r-- | ppapi/cpp/private/flash_net_address.h | 38 | ||||
-rw-r--r-- | ppapi/ppapi_shared.gypi | 2 | ||||
-rw-r--r-- | ppapi/proxy/interface_list.cc | 1 | ||||
-rw-r--r-- | ppapi/shared_impl/private/DEPS | 3 | ||||
-rw-r--r-- | ppapi/shared_impl/private/flash_net_address_impl.cc | 175 | ||||
-rw-r--r-- | ppapi/shared_impl/private/flash_net_address_impl.h | 25 | ||||
-rw-r--r-- | ppapi/thunk/interfaces_ppb_private.h | 1 |
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, |