From ee9bdfce0a8f58d136bf2df3b4a6e4542f5b6c1f Mon Sep 17 00:00:00 2001 From: "yzshen@chromium.org" Date: Thu, 9 Feb 2012 00:04:09 +0000 Subject: PPB_NetAddress_Private: add getter methods for sockaddr. This CL is mostly contributed by Vinay(vinaya@adobe.com): http://codereview.chromium.org/9235035 Comparing with 9235035, this change: - fixes the NaCl Proxy. - adds untrusted tests. - does other small fixes. BUG=None TEST=test_net_address_private and test_net_address_private_untrusted Review URL: https://chromiumcodereview.appspot.com/9307115 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@121106 0039d316-1c4b-4281-b951-d872f2087c98 --- .../browser_ppb_net_address_private_rpc_server.cc | 74 +++++++++++++++++++ .../src/shared/ppapi_proxy/plugin_ppb.cc | 6 +- .../ppapi_proxy/plugin_ppb_net_address_private.cc | 86 +++++++++++++++++++++- .../ppapi_proxy/plugin_ppb_net_address_private.h | 3 +- .../ppapi_proxy/ppb_net_address_private.srpc | 19 +++++ .../src/shared/ppapi_proxy/ppb_rpc_client.cc | 53 +++++++++++++ .../src/shared/ppapi_proxy/ppb_rpc_server.cc | 46 ++++++++++++ .../shared/ppapi_proxy/trusted/srpcgen/ppb_rpc.h | 16 ++++ .../shared/ppapi_proxy/untrusted/srpcgen/ppb_rpc.h | 13 ++++ 9 files changed, 311 insertions(+), 5 deletions(-) (limited to 'ppapi/native_client') diff --git a/ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_net_address_private_rpc_server.cc b/ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_net_address_private_rpc_server.cc index 55de726..6d355a9 100644 --- a/ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_net_address_private_rpc_server.cc +++ b/ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_net_address_private_rpc_server.cc @@ -177,3 +177,77 @@ void PpbNetAddressPrivateRpcServer::PPB_NetAddress_Private_GetAnyAddress( rpc->result = NACL_SRPC_RESULT_OK; } + +void PpbNetAddressPrivateRpcServer::PPB_NetAddress_Private_GetFamily( + NaClSrpcRpc* rpc, + NaClSrpcClosure* done, + // input + nacl_abi_size_t addr_bytes, char* addr, + // output + int32_t* addr_family) { + NaClSrpcClosureRunner runner(done); + rpc->result = NACL_SRPC_RESULT_APP_ERROR; + + if (addr_bytes != + static_cast(sizeof(PP_NetAddress_Private))) { + return; + } + + *addr_family = PPBNetAddressPrivateInterface()->GetFamily( + reinterpret_cast(addr)); + + DebugPrintf("PPB_NetAddress_Private::GetFamily\n"); + + rpc->result = NACL_SRPC_RESULT_OK; +} + +void PpbNetAddressPrivateRpcServer::PPB_NetAddress_Private_GetPort( + NaClSrpcRpc* rpc, + NaClSrpcClosure* done, + // input + nacl_abi_size_t addr_bytes, char* addr, + // output + int32_t* port) { + NaClSrpcClosureRunner runner(done); + rpc->result = NACL_SRPC_RESULT_APP_ERROR; + + if (addr_bytes != + static_cast(sizeof(PP_NetAddress_Private))) { + return; + } + + *port = PPBNetAddressPrivateInterface()->GetPort( + reinterpret_cast(addr)); + + DebugPrintf("PPB_NetAddress_Private::GetPort\n"); + + rpc->result = NACL_SRPC_RESULT_OK; +} + +void PpbNetAddressPrivateRpcServer::PPB_NetAddress_Private_GetAddress( + NaClSrpcRpc* rpc, + NaClSrpcClosure* done, + // input + nacl_abi_size_t addr_bytes, char* addr, + // output + nacl_abi_size_t* address_bytes, char* address, + int32_t* success) { + NaClSrpcClosureRunner runner(done); + rpc->result = NACL_SRPC_RESULT_APP_ERROR; + + if (addr_bytes != + static_cast(sizeof(PP_NetAddress_Private))) { + return; + } + + PP_Bool pp_success = PPBNetAddressPrivateInterface()->GetAddress( + reinterpret_cast(addr), + address, static_cast(*address_bytes)); + + DebugPrintf("PPB_NetAddress_Private::GetAddress: pp_success=%d\n", + pp_success); + + *success = (pp_success == PP_TRUE); + rpc->result = NACL_SRPC_RESULT_OK; +} + diff --git a/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb.cc b/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb.cc index 8d1734d..b33400c 100644 --- a/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb.cc +++ b/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb.cc @@ -82,8 +82,10 @@ InterfaceMapElement interface_map[] = { { PPB_MOUSE_INPUT_EVENT_INTERFACE_1_1, PluginInputEvent::GetMouseInterface1_1(), true }, { PPB_MOUSELOCK_INTERFACE, PluginMouseLock::GetInterface(), true }, - { PPB_NETADDRESS_PRIVATE_INTERFACE, PluginNetAddressPrivate::GetInterface(), - true }, + { PPB_NETADDRESS_PRIVATE_INTERFACE_0_1, + PluginNetAddressPrivate::GetInterface0_1(), true }, + { PPB_NETADDRESS_PRIVATE_INTERFACE_1_0, + PluginNetAddressPrivate::GetInterface1_0(), true }, { PPB_OPENGLES2_INTERFACE, PluginGraphics3D::GetOpenGLESInterface(), true }, { PPB_PDF_INTERFACE, PluginPDF::GetInterface(), true }, diff --git a/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_net_address_private.cc b/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_net_address_private.cc index 521217c..bf4989b 100644 --- a/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_net_address_private.cc +++ b/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_net_address_private.cc @@ -159,15 +159,97 @@ void GetAnyAddress(PP_Bool is_ipv6, PP_NetAddress_Private* addr) { NaClSrpcErrorString(srpc_result)); } +uint16_t GetFamily(const PP_NetAddress_Private* addr) { + DebugPrintf("PPB_NetAddress_Private::GetFamily\n"); + + nacl_abi_size_t addr_bytes = + static_cast(sizeof(PP_NetAddress_Private)); + char* const raw_addr = + reinterpret_cast(const_cast(addr)); + int32_t addr_family; + + NaClSrpcError srpc_result = + PpbNetAddressPrivateRpcClient::PPB_NetAddress_Private_GetFamily( + GetMainSrpcChannel(), + addr_bytes, raw_addr, + &addr_family); + + DebugPrintf("PPB_NetAddress_Private::GetFamily: %s\n", + NaClSrpcErrorString(srpc_result)); + + return static_cast(static_cast(addr_family)); +} + +uint16_t GetPort(const PP_NetAddress_Private* addr) { + DebugPrintf("PPB_NetAddress_Private::GetPort\n"); + + nacl_abi_size_t addr_bytes = + static_cast(sizeof(PP_NetAddress_Private)); + char* const raw_addr = + reinterpret_cast(const_cast(addr)); + int32_t port; + + NaClSrpcError srpc_result = + PpbNetAddressPrivateRpcClient::PPB_NetAddress_Private_GetPort( + GetMainSrpcChannel(), + addr_bytes, raw_addr, + &port); + + DebugPrintf("PPB_NetAddress_Private::GetPort: %s\n", + NaClSrpcErrorString(srpc_result)); + + return static_cast(static_cast(port)); +} + +PP_Bool GetAddress(const PP_NetAddress_Private* addr, + void* address, + uint16_t address_size) { + DebugPrintf("PP_NetAddress_Private::GetAddress"); + + int32_t success = 0; + char* const raw_addr = + reinterpret_cast(const_cast(addr)); + nacl_abi_size_t address_bytes_size = address_size; + NaClSrpcError srpc_result = + PpbNetAddressPrivateRpcClient::PPB_NetAddress_Private_GetAddress( + GetMainSrpcChannel(), + static_cast(sizeof(PP_NetAddress_Private)), raw_addr, + &address_bytes_size, static_cast(address), + &success); + + DebugPrintf("PPB_NetAddressPrivate::GetAddress: %s\n", + NaClSrpcErrorString(srpc_result)); + + if (srpc_result == NACL_SRPC_RESULT_OK && success) + return PP_TRUE; + return PP_FALSE; +} + } // namespace -const PPB_NetAddress_Private* PluginNetAddressPrivate::GetInterface() { - static const PPB_NetAddress_Private netaddress_private_interface = { +// static +const PPB_NetAddress_Private_0_1* PluginNetAddressPrivate::GetInterface0_1() { + static const PPB_NetAddress_Private_0_1 netaddress_private_interface = { + AreEqual, + AreHostsEqual, + Describe, + ReplacePort, + GetAnyAddress + }; + return &netaddress_private_interface; +} + +// static +const PPB_NetAddress_Private_1_0* PluginNetAddressPrivate::GetInterface1_0() { + static const PPB_NetAddress_Private_1_0 netaddress_private_interface = { AreEqual, AreHostsEqual, Describe, ReplacePort, GetAnyAddress, + GetFamily, + GetPort, + GetAddress }; return &netaddress_private_interface; } diff --git a/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_net_address_private.h b/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_net_address_private.h index 8c81c8c..e08d3b2 100644 --- a/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_net_address_private.h +++ b/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_net_address_private.h @@ -13,7 +13,8 @@ namespace ppapi_proxy { // Implements the untrusted side of the PPB_NetAddress_Private interface. class PluginNetAddressPrivate { public: - static const PPB_NetAddress_Private* GetInterface(); + static const PPB_NetAddress_Private_0_1* GetInterface0_1(); + static const PPB_NetAddress_Private_1_0* GetInterface1_0(); private: NACL_DISALLOW_COPY_AND_ASSIGN(PluginNetAddressPrivate); diff --git a/ppapi/native_client/src/shared/ppapi_proxy/ppb_net_address_private.srpc b/ppapi/native_client/src/shared/ppapi_proxy/ppb_net_address_private.srpc index de66184..6a9f5b9 100644 --- a/ppapi/native_client/src/shared/ppapi_proxy/ppb_net_address_private.srpc +++ b/ppapi/native_client/src/shared/ppapi_proxy/ppb_net_address_private.srpc @@ -44,5 +44,24 @@ 'outputs': [['addr', 'char[]'], # PP_NetAddress_Private* ] }, + {'name': 'PPB_NetAddress_Private_GetFamily', + 'inputs': [['addr', 'char[]'], # PP_NetAddress_Private* + ], + 'outputs': [['addr_family', 'int32_t'], # uint16_t + ] + }, + {'name': 'PPB_NetAddress_Private_GetPort', + 'inputs': [['addr', 'char[]'], # PP_NetAddress_Private* + ], + 'outputs': [['port', 'int32_t'], # uint16_t + ] + }, + {'name': 'PPB_NetAddress_Private_GetAddress', + 'inputs': [['addr', 'char[]'], # PP_NetAddress_Private* + ], + 'outputs': [['address', 'char[]'], + ['success', 'int32_t'], # PP_Bool + ] + }, ] } diff --git a/ppapi/native_client/src/shared/ppapi_proxy/ppb_rpc_client.cc b/ppapi/native_client/src/shared/ppapi_proxy/ppb_rpc_client.cc index a0d7d44..68c19ab 100644 --- a/ppapi/native_client/src/shared/ppapi_proxy/ppb_rpc_client.cc +++ b/ppapi/native_client/src/shared/ppapi_proxy/ppb_rpc_client.cc @@ -2026,6 +2026,59 @@ NaClSrpcError PpbNetAddressPrivateRpcClient::PPB_NetAddress_Private_GetAnyAddres return retval; } +NaClSrpcError PpbNetAddressPrivateRpcClient::PPB_NetAddress_Private_GetFamily( + NaClSrpcChannel* channel, + nacl_abi_size_t addr_bytes, char* addr, + int32_t* addr_family) { + VCHECK(ppapi_proxy::PPBCoreInterface()->IsMainThread(), + ("%s: PPAPI calls are not supported off the main thread\n", + __FUNCTION__)); + NaClSrpcError retval; + retval = NaClSrpcInvokeBySignature( + channel, + "PPB_NetAddress_Private_GetFamily:C:i", + addr_bytes, addr, + addr_family + ); + return retval; +} + +NaClSrpcError PpbNetAddressPrivateRpcClient::PPB_NetAddress_Private_GetPort( + NaClSrpcChannel* channel, + nacl_abi_size_t addr_bytes, char* addr, + int32_t* port) { + VCHECK(ppapi_proxy::PPBCoreInterface()->IsMainThread(), + ("%s: PPAPI calls are not supported off the main thread\n", + __FUNCTION__)); + NaClSrpcError retval; + retval = NaClSrpcInvokeBySignature( + channel, + "PPB_NetAddress_Private_GetPort:C:i", + addr_bytes, addr, + port + ); + return retval; +} + +NaClSrpcError PpbNetAddressPrivateRpcClient::PPB_NetAddress_Private_GetAddress( + NaClSrpcChannel* channel, + nacl_abi_size_t addr_bytes, char* addr, + nacl_abi_size_t* address_bytes, char* address, + int32_t* success) { + VCHECK(ppapi_proxy::PPBCoreInterface()->IsMainThread(), + ("%s: PPAPI calls are not supported off the main thread\n", + __FUNCTION__)); + NaClSrpcError retval; + retval = NaClSrpcInvokeBySignature( + channel, + "PPB_NetAddress_Private_GetAddress:C:Ci", + addr_bytes, addr, + address_bytes, address, + success + ); + return retval; +} + NaClSrpcError PpbPdfRpcClient::PPB_PDF_GetLocalizedString( NaClSrpcChannel* channel, PP_Instance instance, diff --git a/ppapi/native_client/src/shared/ppapi_proxy/ppb_rpc_server.cc b/ppapi/native_client/src/shared/ppapi_proxy/ppb_rpc_server.cc index 9476805..91fdd0d 100644 --- a/ppapi/native_client/src/shared/ppapi_proxy/ppb_rpc_server.cc +++ b/ppapi/native_client/src/shared/ppapi_proxy/ppb_rpc_server.cc @@ -1619,6 +1619,49 @@ static void PPB_NetAddress_Private_GetAnyAddressDispatcher( ); } +static void PPB_NetAddress_Private_GetFamilyDispatcher( + NaClSrpcRpc* rpc, + NaClSrpcArg** inputs, + NaClSrpcArg** outputs, + NaClSrpcClosure* done +) { + PpbNetAddressPrivateRpcServer::PPB_NetAddress_Private_GetFamily( + rpc, + done, + inputs[0]->u.count, inputs[0]->arrays.carr, + &(outputs[0]->u.ival) + ); +} + +static void PPB_NetAddress_Private_GetPortDispatcher( + NaClSrpcRpc* rpc, + NaClSrpcArg** inputs, + NaClSrpcArg** outputs, + NaClSrpcClosure* done +) { + PpbNetAddressPrivateRpcServer::PPB_NetAddress_Private_GetPort( + rpc, + done, + inputs[0]->u.count, inputs[0]->arrays.carr, + &(outputs[0]->u.ival) + ); +} + +static void PPB_NetAddress_Private_GetAddressDispatcher( + NaClSrpcRpc* rpc, + NaClSrpcArg** inputs, + NaClSrpcArg** outputs, + NaClSrpcClosure* done +) { + PpbNetAddressPrivateRpcServer::PPB_NetAddress_Private_GetAddress( + rpc, + done, + inputs[0]->u.count, inputs[0]->arrays.carr, + &(outputs[0]->u.count), outputs[0]->arrays.carr, + &(outputs[1]->u.ival) + ); +} + static void PPB_PDF_GetLocalizedStringDispatcher( NaClSrpcRpc* rpc, NaClSrpcArg** inputs, @@ -2973,6 +3016,9 @@ NaClSrpcHandlerDesc PpbRpcs::srpc_methods[] = { { "PPB_NetAddress_Private_Describe:iCi:C", PPB_NetAddress_Private_DescribeDispatcher }, { "PPB_NetAddress_Private_ReplacePort:Ci:Ci", PPB_NetAddress_Private_ReplacePortDispatcher }, { "PPB_NetAddress_Private_GetAnyAddress:i:C", PPB_NetAddress_Private_GetAnyAddressDispatcher }, + { "PPB_NetAddress_Private_GetFamily:C:i", PPB_NetAddress_Private_GetFamilyDispatcher }, + { "PPB_NetAddress_Private_GetPort:C:i", PPB_NetAddress_Private_GetPortDispatcher }, + { "PPB_NetAddress_Private_GetAddress:C:Ci", PPB_NetAddress_Private_GetAddressDispatcher }, { "PPB_PDF_GetLocalizedString:ii:C", PPB_PDF_GetLocalizedStringDispatcher }, { "PPB_PDF_GetResourceImage:ii:i", PPB_PDF_GetResourceImageDispatcher }, { "PPB_PDF_GetFontFileWithFallback:iCCi:i", PPB_PDF_GetFontFileWithFallbackDispatcher }, diff --git a/ppapi/native_client/src/shared/ppapi_proxy/trusted/srpcgen/ppb_rpc.h b/ppapi/native_client/src/shared/ppapi_proxy/trusted/srpcgen/ppb_rpc.h index b2fda1b25..c0e96ee 100644 --- a/ppapi/native_client/src/shared/ppapi_proxy/trusted/srpcgen/ppb_rpc.h +++ b/ppapi/native_client/src/shared/ppapi_proxy/trusted/srpcgen/ppb_rpc.h @@ -841,6 +841,22 @@ class PpbNetAddressPrivateRpcServer { NaClSrpcClosure* done, int32_t is_ipv6, nacl_abi_size_t* addr_bytes, char* addr); + static void PPB_NetAddress_Private_GetFamily( + NaClSrpcRpc* rpc, + NaClSrpcClosure* done, + nacl_abi_size_t addr_bytes, char* addr, + int32_t* addr_family); + static void PPB_NetAddress_Private_GetPort( + NaClSrpcRpc* rpc, + NaClSrpcClosure* done, + nacl_abi_size_t addr_bytes, char* addr, + int32_t* port); + static void PPB_NetAddress_Private_GetAddress( + NaClSrpcRpc* rpc, + NaClSrpcClosure* done, + nacl_abi_size_t addr_bytes, char* addr, + nacl_abi_size_t* address_bytes, char* address, + int32_t* success); private: PpbNetAddressPrivateRpcServer(); diff --git a/ppapi/native_client/src/shared/ppapi_proxy/untrusted/srpcgen/ppb_rpc.h b/ppapi/native_client/src/shared/ppapi_proxy/untrusted/srpcgen/ppb_rpc.h index 6585b48..1f3b993 100644 --- a/ppapi/native_client/src/shared/ppapi_proxy/untrusted/srpcgen/ppb_rpc.h +++ b/ppapi/native_client/src/shared/ppapi_proxy/untrusted/srpcgen/ppb_rpc.h @@ -737,6 +737,19 @@ class PpbNetAddressPrivateRpcClient { NaClSrpcChannel* channel, int32_t is_ipv6, nacl_abi_size_t* addr_bytes, char* addr); + static NaClSrpcError PPB_NetAddress_Private_GetFamily( + NaClSrpcChannel* channel, + nacl_abi_size_t addr_bytes, char* addr, + int32_t* addr_family); + static NaClSrpcError PPB_NetAddress_Private_GetPort( + NaClSrpcChannel* channel, + nacl_abi_size_t addr_bytes, char* addr, + int32_t* port); + static NaClSrpcError PPB_NetAddress_Private_GetAddress( + NaClSrpcChannel* channel, + nacl_abi_size_t addr_bytes, char* addr, + nacl_abi_size_t* address_bytes, char* address, + int32_t* success); private: PpbNetAddressPrivateRpcClient(); -- cgit v1.1