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

Side by Side Diff: runtime/bin/secure_socket.cc

Issue 15772005: - Add different types for persistent and weak persistent handles (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/bin/secure_socket.h ('k') | runtime/include/dart_api.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/secure_socket.h" 5 #include "bin/secure_socket.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <sys/stat.h> 9 #include <sys/stat.h>
10 #include <stdio.h> 10 #include <stdio.h>
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 start_validity_date, 265 start_validity_date,
266 end_validity_date }; 266 end_validity_date };
267 return Dart_New(x509_class, Dart_Null(), 4, arguments); 267 return Dart_New(x509_class, Dart_Null(), 4, arguments);
268 } 268 }
269 269
270 270
271 void SSLFilter::Init(Dart_Handle dart_this) { 271 void SSLFilter::Init(Dart_Handle dart_this) {
272 if (!library_initialized_) { 272 if (!library_initialized_) {
273 InitializeLibrary(NULL, "", true, false); 273 InitializeLibrary(NULL, "", true, false);
274 } 274 }
275 string_start_ = ThrowIfError( 275 ASSERT(string_start_ == NULL);
276 Dart_NewPersistentHandle(DartUtils::NewString("start"))); 276 string_start_ = Dart_NewPersistentHandle(DartUtils::NewString("start"));
277 string_length_ = ThrowIfError( 277 ASSERT(string_start_ != NULL);
278 Dart_NewPersistentHandle(DartUtils::NewString("length"))); 278 ASSERT(string_length_ == NULL);
279 string_length_ = Dart_NewPersistentHandle(DartUtils::NewString("length"));
280 ASSERT(string_length_ != NULL);
281 ASSERT(bad_certificate_callback_ == NULL);
282 bad_certificate_callback_ = Dart_NewPersistentHandle(Dart_Null());
283 ASSERT(bad_certificate_callback_ != NULL);
279 284
280 InitializeBuffers(dart_this); 285 InitializeBuffers(dart_this);
281 filter_ = memio_CreateIOLayer(kMemioBufferSize); 286 filter_ = memio_CreateIOLayer(kMemioBufferSize);
282 } 287 }
283 288
284 289
285 void SSLFilter::InitializeBuffers(Dart_Handle dart_this) { 290 void SSLFilter::InitializeBuffers(Dart_Handle dart_this) {
286 // Create SSLFilter buffers as ExternalUint8Array objects. 291 // Create SSLFilter buffers as ExternalUint8Array objects.
287 Dart_Handle dart_buffers_object = ThrowIfError( 292 Dart_Handle dart_buffers_object = ThrowIfError(
288 Dart_GetField(dart_this, DartUtils::NewString("buffers"))); 293 Dart_GetField(dart_this, DartUtils::NewString("buffers")));
(...skipping 17 matching lines...) Expand all
306 Dart_ThrowException(DartUtils::NewString( 311 Dart_ThrowException(DartUtils::NewString(
307 "Invalid encrypted buffer size in _ExternalBuffer")); 312 "Invalid encrypted buffer size in _ExternalBuffer"));
308 } 313 }
309 buffer_size_ = static_cast<int>(buffer_size); 314 buffer_size_ = static_cast<int>(buffer_size);
310 encrypted_buffer_size_ = static_cast<int>(encrypted_buffer_size); 315 encrypted_buffer_size_ = static_cast<int>(encrypted_buffer_size);
311 316
312 317
313 Dart_Handle data_identifier = DartUtils::NewString("data"); 318 Dart_Handle data_identifier = DartUtils::NewString("data");
314 for (int i = 0; i < kNumBuffers; ++i) { 319 for (int i = 0; i < kNumBuffers; ++i) {
315 int size = isEncrypted(i) ? encrypted_buffer_size_ : buffer_size_; 320 int size = isEncrypted(i) ? encrypted_buffer_size_ : buffer_size_;
316 dart_buffer_objects_[i] = ThrowIfError( 321 dart_buffer_objects_[i] =
317 Dart_NewPersistentHandle(Dart_ListGetAt(dart_buffers_object, i))); 322 Dart_NewPersistentHandle(Dart_ListGetAt(dart_buffers_object, i));
323 ASSERT(dart_buffer_objects_[i] != NULL);
318 buffers_[i] = new uint8_t[size]; 324 buffers_[i] = new uint8_t[size];
319 Dart_Handle data = ThrowIfError( 325 Dart_Handle data = ThrowIfError(
320 Dart_NewExternalTypedData(kUint8, buffers_[i], size, NULL, NULL)); 326 Dart_NewExternalTypedData(kUint8, buffers_[i], size));
321 ThrowIfError(Dart_SetField(dart_buffer_objects_[i], 327 ThrowIfError(
322 data_identifier, 328 Dart_SetField(Dart_HandleFromPersistent(dart_buffer_objects_[i]),
323 data)); 329 data_identifier,
330 data));
324 } 331 }
325 } 332 }
326 333
327 334
328 void SSLFilter::RegisterHandshakeCompleteCallback(Dart_Handle complete) { 335 void SSLFilter::RegisterHandshakeCompleteCallback(Dart_Handle complete) {
329 ASSERT(NULL == handshake_complete_); 336 ASSERT(NULL == handshake_complete_);
330 handshake_complete_ = ThrowIfError(Dart_NewPersistentHandle(complete)); 337 handshake_complete_ = Dart_NewPersistentHandle(complete);
338 ASSERT(handshake_complete_ != NULL);
331 } 339 }
332 340
333 341
334 void SSLFilter::RegisterBadCertificateCallback(Dart_Handle callback) { 342 void SSLFilter::RegisterBadCertificateCallback(Dart_Handle callback) {
335 if (NULL != bad_certificate_callback_) { 343 ASSERT(bad_certificate_callback_ != NULL);
336 Dart_DeletePersistentHandle(bad_certificate_callback_); 344 Dart_DeletePersistentHandle(bad_certificate_callback_);
337 } 345 bad_certificate_callback_ = Dart_NewPersistentHandle(callback);
338 bad_certificate_callback_ = ThrowIfError(Dart_NewPersistentHandle(callback)); 346 ASSERT(bad_certificate_callback_ != NULL);
339 } 347 }
340 348
341 static const char* builtin_roots_module = 349 static const char* builtin_roots_module =
342 #if defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID) 350 #if defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)
343 "name=\"Root Certs\" library=\"libnssckbi.so\""; 351 "name=\"Root Certs\" library=\"libnssckbi.so\"";
344 #elif defined(TARGET_OS_MACOS) 352 #elif defined(TARGET_OS_MACOS)
345 "name=\"Root Certs\" library=\"libnssckbi.dylib\""; 353 "name=\"Root Certs\" library=\"libnssckbi.dylib\"";
346 #elif defined(TARGET_OS_WINDOWS) 354 #elif defined(TARGET_OS_WINDOWS)
347 "name=\"Root Certs\" library=\"nssckbi.dll\""; 355 "name=\"Root Certs\" library=\"nssckbi.dll\"";
348 #else 356 #else
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 if (!retry) { 428 if (!retry) {
421 return PL_strdup(static_cast<char*>(arg)); // Freed by NSS internals. 429 return PL_strdup(static_cast<char*>(arg)); // Freed by NSS internals.
422 } 430 }
423 return NULL; 431 return NULL;
424 } 432 }
425 433
426 434
427 SECStatus BadCertificateCallback(void* filter, PRFileDesc* fd) { 435 SECStatus BadCertificateCallback(void* filter, PRFileDesc* fd) {
428 SSLFilter* ssl_filter = static_cast<SSLFilter*>(filter); 436 SSLFilter* ssl_filter = static_cast<SSLFilter*>(filter);
429 Dart_Handle callback = ssl_filter->bad_certificate_callback(); 437 Dart_Handle callback = ssl_filter->bad_certificate_callback();
430 if (callback == NULL || Dart_IsNull(callback)) return SECFailure; 438 if (Dart_IsNull(callback)) return SECFailure;
431 439
432 Dart_EnterScope(); 440 Dart_EnterScope();
433 Dart_Handle x509_object = ssl_filter->PeerCertificate(); 441 Dart_Handle x509_object = ssl_filter->PeerCertificate();
434 Dart_Handle result = 442 Dart_Handle result =
435 ThrowIfError(Dart_InvokeClosure(callback, 1, &x509_object)); 443 ThrowIfError(Dart_InvokeClosure(callback, 1, &x509_object));
436 bool c_result = Dart_IsBoolean(result) && DartUtils::GetBooleanValue(result); 444 bool c_result = Dart_IsBoolean(result) && DartUtils::GetBooleanValue(result);
437 Dart_ExitScope(); 445 Dart_ExitScope();
438 return c_result ? SECSuccess : SECFailure; 446 return c_result ? SECSuccess : SECFailure;
439 } 447 }
440 448
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
575 583
576 memio_SetPeerName(filter_, &host_address); 584 memio_SetPeerName(filter_, &host_address);
577 PR_FreeAddrInfo(info); 585 PR_FreeAddrInfo(info);
578 } 586 }
579 587
580 588
581 void SSLFilter::Handshake() { 589 void SSLFilter::Handshake() {
582 SECStatus status = SSL_ForceHandshake(filter_); 590 SECStatus status = SSL_ForceHandshake(filter_);
583 if (status == SECSuccess) { 591 if (status == SECSuccess) {
584 if (in_handshake_) { 592 if (in_handshake_) {
585 ThrowIfError(Dart_InvokeClosure(handshake_complete_, 0, NULL)); 593 ThrowIfError(Dart_InvokeClosure(
594 Dart_HandleFromPersistent(handshake_complete_), 0, NULL));
586 in_handshake_ = false; 595 in_handshake_ = false;
587 } 596 }
588 } else { 597 } else {
589 PRErrorCode error = PR_GetError(); 598 PRErrorCode error = PR_GetError();
590 if (error == PR_WOULD_BLOCK_ERROR) { 599 if (error == PR_WOULD_BLOCK_ERROR) {
591 if (!in_handshake_) { 600 if (!in_handshake_) {
592 in_handshake_ = true; 601 in_handshake_ = true;
593 } 602 }
594 } else { 603 } else {
595 if (is_server_) { 604 if (is_server_) {
596 ThrowPRException("Unexpected handshake error in server"); 605 ThrowPRException("Unexpected handshake error in server");
597 } else { 606 } else {
598 ThrowPRException("Unexpected handshake error in client"); 607 ThrowPRException("Unexpected handshake error in client");
599 } 608 }
600 } 609 }
601 } 610 }
602 } 611 }
603 612
604 613
605 void SSLFilter::Destroy() { 614 void SSLFilter::Destroy() {
606 for (int i = 0; i < kNumBuffers; ++i) { 615 for (int i = 0; i < kNumBuffers; ++i) {
607 Dart_DeletePersistentHandle(dart_buffer_objects_[i]); 616 Dart_DeletePersistentHandle(dart_buffer_objects_[i]);
608 delete[] buffers_[i]; 617 delete[] buffers_[i];
609 } 618 }
610 Dart_DeletePersistentHandle(string_start_); 619 Dart_DeletePersistentHandle(string_start_);
611 Dart_DeletePersistentHandle(string_length_); 620 Dart_DeletePersistentHandle(string_length_);
612 Dart_DeletePersistentHandle(handshake_complete_); 621 Dart_DeletePersistentHandle(handshake_complete_);
613 if (bad_certificate_callback_ != NULL) { 622 Dart_DeletePersistentHandle(bad_certificate_callback_);
614 Dart_DeletePersistentHandle(bad_certificate_callback_);
615 }
616 free(client_certificate_name_); 623 free(client_certificate_name_);
617 624
618 PR_Close(filter_); 625 PR_Close(filter_);
619 } 626 }
620 627
621 628
622 intptr_t SSLFilter::ProcessBuffer(int buffer_index) { 629 intptr_t SSLFilter::ProcessBuffer(int buffer_index) {
623 int size = isEncrypted(buffer_index) ? encrypted_buffer_size_ : buffer_size_; 630 int size = isEncrypted(buffer_index) ? encrypted_buffer_size_ : buffer_size_;
624 Dart_Handle buffer_object = dart_buffer_objects_[buffer_index]; 631 Dart_Handle buffer_object =
632 Dart_HandleFromPersistent(dart_buffer_objects_[buffer_index]);
625 Dart_Handle start_object = ThrowIfError( 633 Dart_Handle start_object = ThrowIfError(
626 Dart_GetField(buffer_object, string_start_)); 634 Dart_GetField(buffer_object, Dart_HandleFromPersistent(string_start_)));
627 Dart_Handle length_object = ThrowIfError( 635 Dart_Handle length_object = ThrowIfError(
628 Dart_GetField(buffer_object, string_length_)); 636 Dart_GetField(buffer_object, Dart_HandleFromPersistent(string_length_)));
629 int64_t unsafe_start = DartUtils::GetIntegerValue(start_object); 637 int64_t unsafe_start = DartUtils::GetIntegerValue(start_object);
630 int64_t unsafe_length = DartUtils::GetIntegerValue(length_object); 638 int64_t unsafe_length = DartUtils::GetIntegerValue(length_object);
631 ASSERT(unsafe_start >= 0); 639 ASSERT(unsafe_start >= 0);
632 ASSERT(unsafe_start < size); 640 ASSERT(unsafe_start < size);
633 ASSERT(unsafe_length >= 0); 641 ASSERT(unsafe_length >= 0);
634 ASSERT(unsafe_length <= size); 642 ASSERT(unsafe_length <= size);
635 int start = static_cast<int>(unsafe_start); 643 int start = static_cast<int>(unsafe_start);
636 int length = static_cast<int>(unsafe_length); 644 int length = static_cast<int>(unsafe_length);
637 uint8_t* buffer = buffers_[buffer_index]; 645 uint8_t* buffer = buffers_[buffer_index];
638 646
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 bytes_processed = 0; 722 bytes_processed = 0;
715 } 723 }
716 break; 724 break;
717 } 725 }
718 } 726 }
719 return bytes_processed; 727 return bytes_processed;
720 } 728 }
721 729
722 } // namespace bin 730 } // namespace bin
723 } // namespace dart 731 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/bin/secure_socket.h ('k') | runtime/include/dart_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698