Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(507)

Unified Diff: runtime/bin/secure_socket.cc

Issue 17381012: Ensure that there is no "hidden" DNS lookup in secure socket code (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed review comments Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/secure_socket.h ('k') | runtime/bin/secure_socket_patch.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/secure_socket.cc
diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc
index 4310aec44fc46eae40591b3963836fb30206703f..482f9a640cbb4e333041f481bc062c6346851e36 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,24 @@ 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));
+ intptr_t len = SocketAddress::GetAddrLength(*raw_addr);
+ ASSERT(static_cast<size_t>(len) <= sizeof(peername));
+ memmove(&peername, &raw_addr->addr, len);
+
+ // 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);
}
« no previous file with comments | « runtime/bin/secure_socket.h ('k') | runtime/bin/secure_socket_patch.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698