| OLD | NEW |
| 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 #if !defined(DART_IO_DISABLED) && !defined(DART_IO_SECURE_SOCKET_DISABLED) | 5 #if !defined(DART_IO_DISABLED) && !defined(DART_IO_SECURE_SOCKET_DISABLED) |
| 6 | 6 |
| 7 #include "platform/globals.h" | 7 #include "platform/globals.h" |
| 8 #if defined(TARGET_OS_ANDROID) || defined(TARGET_OS_LINUX) || \ | 8 #if defined(TARGET_OS_ANDROID) || defined(TARGET_OS_LINUX) || \ |
| 9 defined(TARGET_OS_WINDOWS) || defined(TARGET_OS_FUCHSIA) | 9 defined(TARGET_OS_WINDOWS) || defined(TARGET_OS_FUCHSIA) |
| 10 | 10 |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 ASSERT(!Dart_IsNull(protocols_handle)); | 254 ASSERT(!Dart_IsNull(protocols_handle)); |
| 255 | 255 |
| 256 GetFilter(args)->Connect(host_name, context->context(), is_server, | 256 GetFilter(args)->Connect(host_name, context->context(), is_server, |
| 257 request_client_certificate, | 257 request_client_certificate, |
| 258 require_client_certificate, protocols_handle); | 258 require_client_certificate, protocols_handle); |
| 259 } | 259 } |
| 260 | 260 |
| 261 | 261 |
| 262 void FUNCTION_NAME(SecureSocket_Destroy)(Dart_NativeArguments args) { | 262 void FUNCTION_NAME(SecureSocket_Destroy)(Dart_NativeArguments args) { |
| 263 SSLFilter* filter = GetFilter(args); | 263 SSLFilter* filter = GetFilter(args); |
| 264 // The SSLFilter is deleted in the finalizer for the Dart object created by | 264 // There are two paths that can clean up an SSLFilter object. First, |
| 265 // SetFilter. There is no need to NULL-out the native field for the SSLFilter | 265 // there is this explicit call to Destroy(), called from |
| 266 // here because the SSLFilter won't be deleted until the finalizer for the | 266 // _SecureFilter.destroy() in Dart code. After a call to destroy(), the Dart |
| 267 // Dart object runs while the Dart object is being GCd. This approach avoids a | 267 // code maintains the invariant that there will be no futher SSLFilter |
| 268 // leak if Destroy isn't called, and avoids a NULL-dereference if Destroy is | 268 // requests sent to the IO Service. Therefore, the internals of the SSLFilter |
| 269 // called more than once. | 269 // are safe to deallocate, but not the SSLFilter itself, which is already |
| 270 // set up to be cleaned up by the finalizer. |
| 271 // |
| 272 // The second path is through the finalizer, which we have to do in case |
| 273 // some mishap prevents a call to _SecureFilter.destroy(). |
| 270 filter->Destroy(); | 274 filter->Destroy(); |
| 271 } | 275 } |
| 272 | 276 |
| 273 | 277 |
| 274 void FUNCTION_NAME(SecureSocket_Handshake)(Dart_NativeArguments args) { | 278 void FUNCTION_NAME(SecureSocket_Handshake)(Dart_NativeArguments args) { |
| 275 GetFilter(args)->Handshake(); | 279 GetFilter(args)->Handshake(); |
| 276 } | 280 } |
| 277 | 281 |
| 278 | 282 |
| 279 void FUNCTION_NAME(SecureSocket_GetSelectedProtocol)( | 283 void FUNCTION_NAME(SecureSocket_GetSelectedProtocol)( |
| (...skipping 1374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1654 bool require_client_certificate) { | 1658 bool require_client_certificate) { |
| 1655 // The SSL_REQUIRE_CERTIFICATE option only takes effect if the | 1659 // The SSL_REQUIRE_CERTIFICATE option only takes effect if the |
| 1656 // SSL_REQUEST_CERTIFICATE option is also set, so set it. | 1660 // SSL_REQUEST_CERTIFICATE option is also set, so set it. |
| 1657 request_client_certificate = | 1661 request_client_certificate = |
| 1658 request_client_certificate || require_client_certificate; | 1662 request_client_certificate || require_client_certificate; |
| 1659 // TODO(24070, 24069): Implement setting the client certificate parameters, | 1663 // TODO(24070, 24069): Implement setting the client certificate parameters, |
| 1660 // and triggering rehandshake. | 1664 // and triggering rehandshake. |
| 1661 } | 1665 } |
| 1662 | 1666 |
| 1663 | 1667 |
| 1664 SSLFilter::~SSLFilter() { | 1668 void SSLFilter::FreeResources() { |
| 1665 if (ssl_ != NULL) { | 1669 if (ssl_ != NULL) { |
| 1666 SSL_free(ssl_); | 1670 SSL_free(ssl_); |
| 1667 ssl_ = NULL; | 1671 ssl_ = NULL; |
| 1668 } | 1672 } |
| 1669 if (socket_side_ != NULL) { | 1673 if (socket_side_ != NULL) { |
| 1670 BIO_free(socket_side_); | 1674 BIO_free(socket_side_); |
| 1671 socket_side_ = NULL; | 1675 socket_side_ = NULL; |
| 1672 } | 1676 } |
| 1673 if (hostname_ != NULL) { | 1677 if (hostname_ != NULL) { |
| 1674 free(hostname_); | 1678 free(hostname_); |
| 1675 hostname_ = NULL; | 1679 hostname_ = NULL; |
| 1676 } | 1680 } |
| 1677 for (int i = 0; i < kNumBuffers; ++i) { | 1681 for (int i = 0; i < kNumBuffers; ++i) { |
| 1678 if (buffers_[i] != NULL) { | 1682 if (buffers_[i] != NULL) { |
| 1679 delete[] buffers_[i]; | 1683 delete[] buffers_[i]; |
| 1680 buffers_[i] = NULL; | 1684 buffers_[i] = NULL; |
| 1681 } | 1685 } |
| 1682 } | 1686 } |
| 1683 } | 1687 } |
| 1684 | 1688 |
| 1685 | 1689 |
| 1690 SSLFilter::~SSLFilter() { |
| 1691 FreeResources(); |
| 1692 } |
| 1693 |
| 1694 |
| 1686 void SSLFilter::Destroy() { | 1695 void SSLFilter::Destroy() { |
| 1687 for (int i = 0; i < kNumBuffers; ++i) { | 1696 for (int i = 0; i < kNumBuffers; ++i) { |
| 1688 if (dart_buffer_objects_[i] != NULL) { | 1697 if (dart_buffer_objects_[i] != NULL) { |
| 1689 Dart_DeletePersistentHandle(dart_buffer_objects_[i]); | 1698 Dart_DeletePersistentHandle(dart_buffer_objects_[i]); |
| 1690 dart_buffer_objects_[i] = NULL; | 1699 dart_buffer_objects_[i] = NULL; |
| 1691 } | 1700 } |
| 1692 } | 1701 } |
| 1693 if (string_start_ != NULL) { | 1702 if (string_start_ != NULL) { |
| 1694 Dart_DeletePersistentHandle(string_start_); | 1703 Dart_DeletePersistentHandle(string_start_); |
| 1695 string_start_ = NULL; | 1704 string_start_ = NULL; |
| 1696 } | 1705 } |
| 1697 if (string_length_ != NULL) { | 1706 if (string_length_ != NULL) { |
| 1698 Dart_DeletePersistentHandle(string_length_); | 1707 Dart_DeletePersistentHandle(string_length_); |
| 1699 string_length_ = NULL; | 1708 string_length_ = NULL; |
| 1700 } | 1709 } |
| 1701 if (handshake_complete_ != NULL) { | 1710 if (handshake_complete_ != NULL) { |
| 1702 Dart_DeletePersistentHandle(handshake_complete_); | 1711 Dart_DeletePersistentHandle(handshake_complete_); |
| 1703 handshake_complete_ = NULL; | 1712 handshake_complete_ = NULL; |
| 1704 } | 1713 } |
| 1705 if (bad_certificate_callback_ != NULL) { | 1714 if (bad_certificate_callback_ != NULL) { |
| 1706 Dart_DeletePersistentHandle(bad_certificate_callback_); | 1715 Dart_DeletePersistentHandle(bad_certificate_callback_); |
| 1707 bad_certificate_callback_ = NULL; | 1716 bad_certificate_callback_ = NULL; |
| 1708 } | 1717 } |
| 1718 FreeResources(); |
| 1709 } | 1719 } |
| 1710 | 1720 |
| 1711 | 1721 |
| 1712 /* Read decrypted data from the filter to the circular buffer */ | 1722 /* Read decrypted data from the filter to the circular buffer */ |
| 1713 int SSLFilter::ProcessReadPlaintextBuffer(int start, int end) { | 1723 int SSLFilter::ProcessReadPlaintextBuffer(int start, int end) { |
| 1714 int length = end - start; | 1724 int length = end - start; |
| 1715 int bytes_processed = 0; | 1725 int bytes_processed = 0; |
| 1716 if (length > 0) { | 1726 if (length > 0) { |
| 1717 bytes_processed = SSL_read( | 1727 bytes_processed = SSL_read( |
| 1718 ssl_, reinterpret_cast<char*>((buffers_[kReadPlaintext] + start)), | 1728 ssl_, reinterpret_cast<char*>((buffers_[kReadPlaintext] + start)), |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1786 return bytes_processed; | 1796 return bytes_processed; |
| 1787 } | 1797 } |
| 1788 | 1798 |
| 1789 } // namespace bin | 1799 } // namespace bin |
| 1790 } // namespace dart | 1800 } // namespace dart |
| 1791 | 1801 |
| 1792 #endif // defined(TARGET_OS_LINUX) | 1802 #endif // defined(TARGET_OS_LINUX) |
| 1793 | 1803 |
| 1794 #endif // !defined(DART_IO_DISABLED) && | 1804 #endif // !defined(DART_IO_DISABLED) && |
| 1795 // !defined(DART_IO_SECURE_SOCKET_DISABLED) | 1805 // !defined(DART_IO_SECURE_SOCKET_DISABLED) |
| OLD | NEW |