Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived | 5 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived |
| 6 // from AuthCertificateCallback() in | 6 // from AuthCertificateCallback() in |
| 7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. | 7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. |
| 8 | 8 |
| 9 /* ***** BEGIN LICENSE BLOCK ***** | 9 /* ***** BEGIN LICENSE BLOCK ***** |
| 10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
| (...skipping 872 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 883 // True if NSS has False Started. | 883 // True if NSS has False Started. |
| 884 bool false_started_; | 884 bool false_started_; |
| 885 // True if NSS has called HandshakeCallback. | 885 // True if NSS has called HandshakeCallback. |
| 886 bool handshake_callback_called_; | 886 bool handshake_callback_called_; |
| 887 | 887 |
| 888 HandshakeState nss_handshake_state_; | 888 HandshakeState nss_handshake_state_; |
| 889 | 889 |
| 890 bool transport_recv_busy_; | 890 bool transport_recv_busy_; |
| 891 bool transport_recv_eof_; | 891 bool transport_recv_eof_; |
| 892 bool transport_send_busy_; | 892 bool transport_send_busy_; |
| 893 int transport_send_error_; | |
| 893 | 894 |
| 894 // Used by Read function. | 895 // Used by Read function. |
| 895 scoped_refptr<IOBuffer> user_read_buf_; | 896 scoped_refptr<IOBuffer> user_read_buf_; |
| 896 int user_read_buf_len_; | 897 int user_read_buf_len_; |
| 897 | 898 |
| 898 // Used by Write function. | 899 // Used by Write function. |
| 899 scoped_refptr<IOBuffer> user_write_buf_; | 900 scoped_refptr<IOBuffer> user_write_buf_; |
| 900 int user_write_buf_len_; | 901 int user_write_buf_len_; |
| 901 | 902 |
| 902 CompletionCallback user_connect_callback_; | 903 CompletionCallback user_connect_callback_; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 949 pending_read_nss_error_(0), | 950 pending_read_nss_error_(0), |
| 950 next_handshake_state_(STATE_NONE), | 951 next_handshake_state_(STATE_NONE), |
| 951 channel_id_xtn_negotiated_(false), | 952 channel_id_xtn_negotiated_(false), |
| 952 channel_id_needed_(false), | 953 channel_id_needed_(false), |
| 953 client_auth_cert_needed_(false), | 954 client_auth_cert_needed_(false), |
| 954 false_started_(false), | 955 false_started_(false), |
| 955 handshake_callback_called_(false), | 956 handshake_callback_called_(false), |
| 956 transport_recv_busy_(false), | 957 transport_recv_busy_(false), |
| 957 transport_recv_eof_(false), | 958 transport_recv_eof_(false), |
| 958 transport_send_busy_(false), | 959 transport_send_busy_(false), |
| 960 transport_send_error_(0), | |
|
wtc
2014/06/16 19:57:21
I assume transport_send_error_ is a net:: error co
davidben
2014/06/16 23:02:13
Done.
| |
| 959 user_read_buf_len_(0), | 961 user_read_buf_len_(0), |
| 960 user_write_buf_len_(0), | 962 user_write_buf_len_(0), |
| 961 network_task_runner_(network_task_runner), | 963 network_task_runner_(network_task_runner), |
| 962 nss_task_runner_(nss_task_runner), | 964 nss_task_runner_(nss_task_runner), |
| 963 weak_net_log_(weak_net_log_factory_.GetWeakPtr()) { | 965 weak_net_log_(weak_net_log_factory_.GetWeakPtr()) { |
| 964 } | 966 } |
| 965 | 967 |
| 966 SSLClientSocketNSS::Core::~Core() { | 968 SSLClientSocketNSS::Core::~Core() { |
| 967 // TODO(wtc): Send SSL close_notify alert. | 969 // TODO(wtc): Send SSL close_notify alert. |
| 968 if (nss_fd_ != NULL) { | 970 if (nss_fd_ != NULL) { |
| (...skipping 1163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2132 } | 2134 } |
| 2133 | 2135 |
| 2134 // Return 0 if nss_bufs_ was empty, | 2136 // Return 0 if nss_bufs_ was empty, |
| 2135 // > 0 for bytes transferred immediately, | 2137 // > 0 for bytes transferred immediately, |
| 2136 // < 0 for error (or the non-error ERR_IO_PENDING). | 2138 // < 0 for error (or the non-error ERR_IO_PENDING). |
| 2137 int SSLClientSocketNSS::Core::BufferSend() { | 2139 int SSLClientSocketNSS::Core::BufferSend() { |
| 2138 DCHECK(OnNSSTaskRunner()); | 2140 DCHECK(OnNSSTaskRunner()); |
| 2139 | 2141 |
| 2140 if (transport_send_busy_) | 2142 if (transport_send_busy_) |
| 2141 return ERR_IO_PENDING; | 2143 return ERR_IO_PENDING; |
| 2144 if (transport_send_error_ != 0) | |
| 2145 return transport_send_error_; | |
|
Ryan Sleevi
2014/06/16 22:07:07
Why introduce another member, when we already have
davidben
2014/06/16 23:02:13
Good point. That's much cleaner. Done.
| |
| 2142 | 2146 |
| 2143 const char* buf1; | 2147 const char* buf1; |
| 2144 const char* buf2; | 2148 const char* buf2; |
| 2145 unsigned int len1, len2; | 2149 unsigned int len1, len2; |
| 2146 memio_GetWriteParams(nss_bufs_, &buf1, &len1, &buf2, &len2); | 2150 memio_GetWriteParams(nss_bufs_, &buf1, &len1, &buf2, &len2); |
| 2147 const unsigned int len = len1 + len2; | 2151 const unsigned int len = len1 + len2; |
| 2148 | 2152 |
| 2149 int rv = 0; | 2153 int rv = 0; |
| 2150 if (len) { | 2154 if (len) { |
| 2151 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); | 2155 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2620 int rv = transport_->socket()->Write( | 2624 int rv = transport_->socket()->Write( |
| 2621 send_buffer, len, | 2625 send_buffer, len, |
| 2622 base::Bind(&Core::BufferSendComplete, | 2626 base::Bind(&Core::BufferSendComplete, |
| 2623 base::Unretained(this))); | 2627 base::Unretained(this))); |
| 2624 | 2628 |
| 2625 if (!OnNSSTaskRunner() && rv != ERR_IO_PENDING) { | 2629 if (!OnNSSTaskRunner() && rv != ERR_IO_PENDING) { |
| 2626 nss_task_runner_->PostTask( | 2630 nss_task_runner_->PostTask( |
| 2627 FROM_HERE, | 2631 FROM_HERE, |
| 2628 base::Bind(&Core::BufferSendComplete, this, rv)); | 2632 base::Bind(&Core::BufferSendComplete, this, rv)); |
| 2629 return rv; | 2633 return rv; |
| 2630 } | 2634 } |
|
wtc
2014/06/16 19:57:21
IMPORTANT: I think we should also set transport_se
davidben
2014/06/16 23:02:13
Done. And then did Ryan's suggestion.
| |
| 2631 | 2635 |
| 2632 return rv; | 2636 return rv; |
| 2633 } | 2637 } |
| 2634 | 2638 |
| 2635 int SSLClientSocketNSS::Core::DoGetDomainBoundCert(const std::string& host) { | 2639 int SSLClientSocketNSS::Core::DoGetDomainBoundCert(const std::string& host) { |
| 2636 DCHECK(OnNetworkTaskRunner()); | 2640 DCHECK(OnNetworkTaskRunner()); |
| 2637 | 2641 |
| 2638 if (detached_) | 2642 if (detached_) |
| 2639 return ERR_FAILED; | 2643 return ERR_FAILED; |
| 2640 | 2644 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2697 | 2701 |
| 2698 nss_task_runner_->PostTask( | 2702 nss_task_runner_->PostTask( |
| 2699 FROM_HERE, base::Bind(&Core::BufferSendComplete, this, result)); | 2703 FROM_HERE, base::Bind(&Core::BufferSendComplete, this, result)); |
| 2700 return; | 2704 return; |
| 2701 } | 2705 } |
| 2702 | 2706 |
| 2703 DCHECK(OnNSSTaskRunner()); | 2707 DCHECK(OnNSSTaskRunner()); |
| 2704 | 2708 |
| 2705 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(result)); | 2709 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(result)); |
| 2706 transport_send_busy_ = false; | 2710 transport_send_busy_ = false; |
| 2711 // If there was an error, save the result on the NSS task runner. Future calls | |
| 2712 // to BufferSend will return the error synchronously rather than calling | |
| 2713 // DoBufferSend on the network task runner. This is important to prevent | |
| 2714 // spinning infinitely. See https://crbug.com/381160. | |
|
wtc
2014/06/16 19:57:21
Nit: it may be better to move this comment (starti
davidben
2014/06/16 23:02:13
Done.
| |
| 2715 if (result < 0) | |
| 2716 transport_send_error_ = result; | |
| 2707 OnSendComplete(result); | 2717 OnSendComplete(result); |
| 2708 } | 2718 } |
| 2709 | 2719 |
| 2710 void SSLClientSocketNSS::Core::OnHandshakeIOComplete(int result) { | 2720 void SSLClientSocketNSS::Core::OnHandshakeIOComplete(int result) { |
| 2711 if (!OnNSSTaskRunner()) { | 2721 if (!OnNSSTaskRunner()) { |
| 2712 if (detached_) | 2722 if (detached_) |
| 2713 return; | 2723 return; |
| 2714 | 2724 |
| 2715 nss_task_runner_->PostTask( | 2725 nss_task_runner_->PostTask( |
| 2716 FROM_HERE, base::Bind(&Core::OnHandshakeIOComplete, this, result)); | 2726 FROM_HERE, base::Bind(&Core::OnHandshakeIOComplete, this, result)); |
| (...skipping 897 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3614 scoped_refptr<X509Certificate> | 3624 scoped_refptr<X509Certificate> |
| 3615 SSLClientSocketNSS::GetUnverifiedServerCertificateChain() const { | 3625 SSLClientSocketNSS::GetUnverifiedServerCertificateChain() const { |
| 3616 return core_->state().server_cert.get(); | 3626 return core_->state().server_cert.get(); |
| 3617 } | 3627 } |
| 3618 | 3628 |
| 3619 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { | 3629 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { |
| 3620 return server_bound_cert_service_; | 3630 return server_bound_cert_service_; |
| 3621 } | 3631 } |
| 3622 | 3632 |
| 3623 } // namespace net | 3633 } // namespace net |
| OLD | NEW |