Chromium Code Reviews| Index: runtime/bin/secure_socket.cc |
| diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc |
| index 4310aec44fc46eae40591b3963836fb30206703f..cad93ea59936674d9c9b93cad2c110497c361eec 100644 |
| --- a/runtime/bin/secure_socket.cc |
| +++ b/runtime/bin/secure_socket.cc |
| @@ -24,6 +24,7 @@ |
| #include "bin/builtin.h" |
| #include "bin/dartutils.h" |
| #include "bin/net/nss_memio.h" |
| +#include "bin/socket.h" |
| #include "bin/thread.h" |
| #include "bin/utils.h" |
| #include "platform/utils.h" |
| @@ -77,21 +78,35 @@ void FUNCTION_NAME(SecureSocket_Init)(Dart_NativeArguments args) { |
| void FUNCTION_NAME(SecureSocket_Connect)(Dart_NativeArguments args) { |
| Dart_EnterScope(); |
| Dart_Handle host_name_object = ThrowIfError(Dart_GetNativeArgument(args, 1)); |
| - Dart_Handle port_object = ThrowIfError(Dart_GetNativeArgument(args, 2)); |
| - bool is_server = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); |
| + Dart_Handle host_sockaddr_storage_object = |
| + ThrowIfError(Dart_GetNativeArgument(args, 2)); |
| + Dart_Handle port_object = ThrowIfError(Dart_GetNativeArgument(args, 3)); |
| + bool is_server = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); |
| Dart_Handle certificate_name_object = |
| - ThrowIfError(Dart_GetNativeArgument(args, 4)); |
| + ThrowIfError(Dart_GetNativeArgument(args, 5)); |
| bool request_client_certificate = |
| - DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 5)); |
| - bool require_client_certificate = |
| DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 6)); |
| - bool send_client_certificate = |
| + bool require_client_certificate = |
| DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 7)); |
| + bool send_client_certificate = |
| + DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 8)); |
| const char* host_name = NULL; |
| // TODO(whesse): Is truncating a Dart string containing \0 what we want? |
| ThrowIfError(Dart_StringToCString(host_name_object, &host_name)); |
| + RawAddr raw_addr; |
| + Dart_TypedData_Type type; |
| + uint8_t* buffer = NULL; |
| + intptr_t len; |
| + ThrowIfError(Dart_TypedDataAcquireData(host_sockaddr_storage_object, |
| + &type, |
| + reinterpret_cast<void**>(&buffer), |
| + &len)); |
| + ASSERT(static_cast<size_t>(len) <= sizeof(raw_addr)); |
| + memmove(&raw_addr, buffer, len); |
| + Dart_TypedDataReleaseData(host_sockaddr_storage_object); |
| + |
| int64_t port; |
| if (!DartUtils::GetInt64Value(port_object, &port)) { |
| FATAL("The range of port_object was checked in Dart - it cannot fail here"); |
| @@ -106,6 +121,7 @@ void FUNCTION_NAME(SecureSocket_Connect)(Dart_NativeArguments args) { |
| ASSERT(!is_server || certificate_name != NULL); |
| GetFilter(args)->Connect(host_name, |
| + &raw_addr, |
| static_cast<int>(port), |
| is_server, |
| certificate_name, |
| @@ -457,6 +473,7 @@ Dart_Handle SSLFilter::PeerCertificate() { |
| void SSLFilter::Connect(const char* host_name, |
| + RawAddr* raw_addr, |
| int port, |
| bool is_server, |
| const char* certificate_name, |
| @@ -570,19 +587,23 @@ void SSLFilter::Connect(const char* host_name, |
| ThrowPRException("Failed SSL_ResetHandshake call"); |
| } |
| - // SetPeerAddress |
| - PRNetAddr host_address; |
| - PRAddrInfo* info = PR_GetAddrInfoByName(host_name, |
| - PR_AF_UNSPEC, |
| - PR_AI_ADDRCONFIG); |
| - if (info == NULL) { |
| - ThrowPRException("Failed PR_GetAddrInfoByName call"); |
| - } |
| - |
| - PR_EnumerateAddrInfo(0, info, port, &host_address); |
| - |
| - memio_SetPeerName(filter_, &host_address); |
| - PR_FreeAddrInfo(info); |
| + // Set the peer address from the address passed. The DNS has already |
| + // been done in Dart code, so just use that address. This relies on |
| + // following about PRNetAddr: "The raw member of the union is |
| + // equivalent to struct sockaddr", which is stated in the NSS |
| + // documentation. |
| + PRNetAddr peername; |
| + memset(&peername, 0, sizeof(peername)); |
| + ASSERT(sizeof(raw_addr->addr) < sizeof(peername)); |
|
Anders Johnsen
2013/06/19 08:44:53
raw_addr->addr -> raw_addr->ss
or use
'static in
Søren Gjesse
2013/06/19 09:06:53
Good Catch! Done.
|
| + memmove(&peername, &raw_addr->addr, sizeof(raw_addr->addr)); |
|
Anders Johnsen
2013/06/19 08:44:53
Ditto
Søren Gjesse
2013/06/19 09:06:53
Done.
|
| + |
| + // Adjust the address family field for BSD, whose sockaddr |
| + // structure has a one-byte length and one-byte address family |
| + // field at the beginning. PRNetAddr has a two-byte address |
| + // family field at the beginning. |
| + peername.raw.family = raw_addr->addr.sa_family; |
| + |
| + memio_SetPeerName(filter_, &peername); |
| } |