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 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
635 // any time. | 635 // any time. |
636 const HandshakeState& state() const { return network_handshake_state_; } | 636 const HandshakeState& state() const { return network_handshake_state_; } |
637 | 637 |
638 // Called on the network task runner. | 638 // Called on the network task runner. |
639 // Read() and Write() mirror the net::Socket functions of the same name. | 639 // Read() and Write() mirror the net::Socket functions of the same name. |
640 // If ERR_IO_PENDING is returned, |callback| will be invoked on the network | 640 // If ERR_IO_PENDING is returned, |callback| will be invoked on the network |
641 // task runner at a later point, unless the caller calls Detach(). | 641 // task runner at a later point, unless the caller calls Detach(). |
642 int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback); | 642 int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback); |
643 int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback); | 643 int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback); |
644 | 644 |
645 // Called on the network task runner. | |
646 bool IsConnected(); | |
647 bool HasPendingAsyncOperation(); | |
648 bool HasUnhandledReceivedData(); | |
649 | |
645 private: | 650 private: |
646 friend class base::RefCountedThreadSafe<Core>; | 651 friend class base::RefCountedThreadSafe<Core>; |
647 ~Core(); | 652 ~Core(); |
648 | 653 |
649 enum State { | 654 enum State { |
650 STATE_NONE, | 655 STATE_NONE, |
651 STATE_HANDSHAKE, | 656 STATE_HANDSHAKE, |
652 STATE_GET_DOMAIN_BOUND_CERT_COMPLETE, | 657 STATE_GET_DOMAIN_BOUND_CERT_COMPLETE, |
653 }; | 658 }; |
654 | 659 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
767 //////////////////////////////////////////////////////////////////////////// | 772 //////////////////////////////////////////////////////////////////////////// |
768 // Methods that are ONLY called on the network task runner: | 773 // Methods that are ONLY called on the network task runner: |
769 //////////////////////////////////////////////////////////////////////////// | 774 //////////////////////////////////////////////////////////////////////////// |
770 int DoBufferRecv(IOBuffer* buffer, int len); | 775 int DoBufferRecv(IOBuffer* buffer, int len); |
771 int DoBufferSend(IOBuffer* buffer, int len); | 776 int DoBufferSend(IOBuffer* buffer, int len); |
772 int DoGetDomainBoundCert(const std::string& origin, | 777 int DoGetDomainBoundCert(const std::string& origin, |
773 const std::vector<uint8>& requested_cert_types); | 778 const std::vector<uint8>& requested_cert_types); |
774 | 779 |
775 void OnGetDomainBoundCertComplete(int result); | 780 void OnGetDomainBoundCertComplete(int result); |
776 void OnHandshakeStateUpdated(const HandshakeState& state); | 781 void OnHandshakeStateUpdated(const HandshakeState& state); |
782 void OnNSSBufferUpdated(int amount_in_read_buffer); | |
783 void DidNSSRead(int result); | |
784 void DidNSSWrite(int result); | |
777 | 785 |
778 //////////////////////////////////////////////////////////////////////////// | 786 //////////////////////////////////////////////////////////////////////////// |
779 // Methods that are called on both the network task runner and the NSS | 787 // Methods that are called on both the network task runner and the NSS |
780 // task runner. | 788 // task runner. |
781 //////////////////////////////////////////////////////////////////////////// | 789 //////////////////////////////////////////////////////////////////////////// |
782 void OnHandshakeIOComplete(int result); | 790 void OnHandshakeIOComplete(int result); |
783 void BufferRecvComplete(IOBuffer* buffer, int result); | 791 void BufferRecvComplete(IOBuffer* buffer, int result); |
784 void BufferSendComplete(int result); | 792 void BufferSendComplete(int result); |
785 | 793 |
786 // PostOrRunCallback is a helper function to ensure that |callback| is | 794 // PostOrRunCallback is a helper function to ensure that |callback| is |
(...skipping 23 matching lines...) Expand all Loading... | |
810 ClientSocketHandle* transport_; | 818 ClientSocketHandle* transport_; |
811 base::WeakPtrFactory<BoundNetLog> weak_net_log_factory_; | 819 base::WeakPtrFactory<BoundNetLog> weak_net_log_factory_; |
812 | 820 |
813 // The current handshake state. Mirrors |nss_handshake_state_|. | 821 // The current handshake state. Mirrors |nss_handshake_state_|. |
814 HandshakeState network_handshake_state_; | 822 HandshakeState network_handshake_state_; |
815 | 823 |
816 // The service for retrieving Channel ID keys. May be NULL. | 824 // The service for retrieving Channel ID keys. May be NULL. |
817 ServerBoundCertService* server_bound_cert_service_; | 825 ServerBoundCertService* server_bound_cert_service_; |
818 ServerBoundCertService::RequestHandle domain_bound_cert_request_handle_; | 826 ServerBoundCertService::RequestHandle domain_bound_cert_request_handle_; |
819 | 827 |
828 // The information about NSS task runner. | |
829 int unhandled_buffer_size_; | |
830 bool nss_waiting_read_; | |
831 bool nss_waiting_write_; | |
832 bool nss_is_closed_; | |
833 | |
820 //////////////////////////////////////////////////////////////////////////// | 834 //////////////////////////////////////////////////////////////////////////// |
821 // Members that are ONLY accessed on the NSS task runner: | 835 // Members that are ONLY accessed on the NSS task runner: |
822 //////////////////////////////////////////////////////////////////////////// | 836 //////////////////////////////////////////////////////////////////////////// |
823 HostPortPair host_and_port_; | 837 HostPortPair host_and_port_; |
824 SSLConfig ssl_config_; | 838 SSLConfig ssl_config_; |
825 | 839 |
826 // NSS SSL socket. | 840 // NSS SSL socket. |
827 PRFileDesc* nss_fd_; | 841 PRFileDesc* nss_fd_; |
828 | 842 |
829 // Buffers for the network end of the SSL state machine | 843 // Buffers for the network end of the SSL state machine |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
889 base::SequencedTaskRunner* nss_task_runner, | 903 base::SequencedTaskRunner* nss_task_runner, |
890 ClientSocketHandle* transport, | 904 ClientSocketHandle* transport, |
891 const HostPortPair& host_and_port, | 905 const HostPortPair& host_and_port, |
892 const SSLConfig& ssl_config, | 906 const SSLConfig& ssl_config, |
893 BoundNetLog* net_log, | 907 BoundNetLog* net_log, |
894 ServerBoundCertService* server_bound_cert_service) | 908 ServerBoundCertService* server_bound_cert_service) |
895 : detached_(false), | 909 : detached_(false), |
896 transport_(transport), | 910 transport_(transport), |
897 weak_net_log_factory_(net_log), | 911 weak_net_log_factory_(net_log), |
898 server_bound_cert_service_(server_bound_cert_service), | 912 server_bound_cert_service_(server_bound_cert_service), |
913 unhandled_buffer_size_(0), | |
914 nss_waiting_read_(false), | |
915 nss_waiting_write_(false), | |
916 nss_is_closed_(false), | |
899 host_and_port_(host_and_port), | 917 host_and_port_(host_and_port), |
900 ssl_config_(ssl_config), | 918 ssl_config_(ssl_config), |
901 nss_fd_(NULL), | 919 nss_fd_(NULL), |
902 nss_bufs_(NULL), | 920 nss_bufs_(NULL), |
903 next_handshake_state_(STATE_NONE), | 921 next_handshake_state_(STATE_NONE), |
904 channel_id_xtn_negotiated_(false), | 922 channel_id_xtn_negotiated_(false), |
905 channel_id_needed_(false), | 923 channel_id_needed_(false), |
906 client_auth_cert_needed_(false), | 924 client_auth_cert_needed_(false), |
907 handshake_callback_called_(false), | 925 handshake_callback_called_(false), |
908 transport_recv_busy_(false), | 926 transport_recv_busy_(false), |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1082 | 1100 |
1083 domain_bound_cert_request_handle_.Cancel(); | 1101 domain_bound_cert_request_handle_.Cancel(); |
1084 } | 1102 } |
1085 | 1103 |
1086 int SSLClientSocketNSS::Core::Read(IOBuffer* buf, int buf_len, | 1104 int SSLClientSocketNSS::Core::Read(IOBuffer* buf, int buf_len, |
1087 const CompletionCallback& callback) { | 1105 const CompletionCallback& callback) { |
1088 if (!OnNSSTaskRunner()) { | 1106 if (!OnNSSTaskRunner()) { |
1089 DCHECK(OnNetworkTaskRunner()); | 1107 DCHECK(OnNetworkTaskRunner()); |
1090 DCHECK(!detached_); | 1108 DCHECK(!detached_); |
1091 DCHECK(transport_); | 1109 DCHECK(transport_); |
1110 DCHECK(!nss_waiting_read_); | |
1092 | 1111 |
1112 nss_waiting_read_ = true; | |
1093 bool posted = nss_task_runner_->PostTask( | 1113 bool posted = nss_task_runner_->PostTask( |
1094 FROM_HERE, | 1114 FROM_HERE, |
1095 base::Bind(IgnoreResult(&Core::Read), this, make_scoped_refptr(buf), | 1115 base::Bind(IgnoreResult(&Core::Read), this, make_scoped_refptr(buf), |
1096 buf_len, callback)); | 1116 buf_len, callback)); |
1117 if (!posted) { | |
1118 nss_is_closed_ = true; | |
1119 nss_waiting_read_ = false; | |
1120 } | |
1097 return posted ? ERR_IO_PENDING : ERR_ABORTED; | 1121 return posted ? ERR_IO_PENDING : ERR_ABORTED; |
1098 } | 1122 } |
1099 | 1123 |
1100 DCHECK(OnNSSTaskRunner()); | 1124 DCHECK(OnNSSTaskRunner()); |
1101 DCHECK(handshake_callback_called_); | 1125 DCHECK(handshake_callback_called_); |
1102 DCHECK_EQ(STATE_NONE, next_handshake_state_); | 1126 DCHECK_EQ(STATE_NONE, next_handshake_state_); |
1103 DCHECK(user_read_callback_.is_null()); | 1127 DCHECK(user_read_callback_.is_null()); |
1104 DCHECK(user_connect_callback_.is_null()); | 1128 DCHECK(user_connect_callback_.is_null()); |
1105 DCHECK(!user_read_buf_); | 1129 DCHECK(!user_read_buf_); |
1106 DCHECK(nss_bufs_); | 1130 DCHECK(nss_bufs_); |
1107 | 1131 |
1108 user_read_buf_ = buf; | 1132 user_read_buf_ = buf; |
1109 user_read_buf_len_ = buf_len; | 1133 user_read_buf_len_ = buf_len; |
1110 | 1134 |
1111 int rv = DoReadLoop(OK); | 1135 int rv = DoReadLoop(OK); |
1112 if (rv == ERR_IO_PENDING) { | 1136 if (rv == ERR_IO_PENDING) { |
1137 if (OnNetworkTaskRunner()) | |
1138 nss_waiting_read_ = true; | |
1113 user_read_callback_ = callback; | 1139 user_read_callback_ = callback; |
1114 } else { | 1140 } else { |
1115 user_read_buf_ = NULL; | 1141 user_read_buf_ = NULL; |
1116 user_read_buf_len_ = 0; | 1142 user_read_buf_len_ = 0; |
1117 | 1143 |
1118 if (!OnNetworkTaskRunner()) { | 1144 if (!OnNetworkTaskRunner()) { |
1145 PostOrRunCallback(FROM_HERE, base::Bind(&Core::DidNSSRead, this, rv)); | |
1119 PostOrRunCallback(FROM_HERE, base::Bind(callback, rv)); | 1146 PostOrRunCallback(FROM_HERE, base::Bind(callback, rv)); |
1120 return ERR_IO_PENDING; | 1147 return ERR_IO_PENDING; |
1148 } else { | |
1149 DCHECK(!nss_waiting_read_); | |
1150 if (rv <= 0) | |
1151 nss_is_closed_ = true; | |
1121 } | 1152 } |
1122 } | 1153 } |
1123 | 1154 |
1124 return rv; | 1155 return rv; |
1125 } | 1156 } |
1126 | 1157 |
1127 int SSLClientSocketNSS::Core::Write(IOBuffer* buf, int buf_len, | 1158 int SSLClientSocketNSS::Core::Write(IOBuffer* buf, int buf_len, |
1128 const CompletionCallback& callback) { | 1159 const CompletionCallback& callback) { |
1129 if (!OnNSSTaskRunner()) { | 1160 if (!OnNSSTaskRunner()) { |
1130 DCHECK(OnNetworkTaskRunner()); | 1161 DCHECK(OnNetworkTaskRunner()); |
1131 DCHECK(!detached_); | 1162 DCHECK(!detached_); |
1132 DCHECK(transport_); | 1163 DCHECK(transport_); |
1164 DCHECK(!nss_waiting_write_); | |
1133 | 1165 |
1166 nss_waiting_write_ = true; | |
1134 bool posted = nss_task_runner_->PostTask( | 1167 bool posted = nss_task_runner_->PostTask( |
1135 FROM_HERE, | 1168 FROM_HERE, |
1136 base::Bind(IgnoreResult(&Core::Write), this, make_scoped_refptr(buf), | 1169 base::Bind(IgnoreResult(&Core::Write), this, make_scoped_refptr(buf), |
1137 buf_len, callback)); | 1170 buf_len, callback)); |
1138 int rv = posted ? ERR_IO_PENDING : ERR_ABORTED; | 1171 if (!posted) { |
1139 return rv; | 1172 nss_is_closed_ = true; |
1173 nss_waiting_write_ = false; | |
1174 } | |
1175 return posted ? ERR_IO_PENDING : ERR_ABORTED; | |
1140 } | 1176 } |
1141 | 1177 |
1142 DCHECK(OnNSSTaskRunner()); | 1178 DCHECK(OnNSSTaskRunner()); |
1143 DCHECK(handshake_callback_called_); | 1179 DCHECK(handshake_callback_called_); |
1144 DCHECK_EQ(STATE_NONE, next_handshake_state_); | 1180 DCHECK_EQ(STATE_NONE, next_handshake_state_); |
1145 DCHECK(user_write_callback_.is_null()); | 1181 DCHECK(user_write_callback_.is_null()); |
1146 DCHECK(user_connect_callback_.is_null()); | 1182 DCHECK(user_connect_callback_.is_null()); |
1147 DCHECK(!user_write_buf_); | 1183 DCHECK(!user_write_buf_); |
1148 DCHECK(nss_bufs_); | 1184 DCHECK(nss_bufs_); |
1149 | 1185 |
1150 user_write_buf_ = buf; | 1186 user_write_buf_ = buf; |
1151 user_write_buf_len_ = buf_len; | 1187 user_write_buf_len_ = buf_len; |
1152 | 1188 |
1153 int rv = DoWriteLoop(OK); | 1189 int rv = DoWriteLoop(OK); |
1154 if (rv == ERR_IO_PENDING) { | 1190 if (rv == ERR_IO_PENDING) { |
1191 if (OnNetworkTaskRunner()) | |
1192 nss_waiting_write_ = true; | |
1155 user_write_callback_ = callback; | 1193 user_write_callback_ = callback; |
1156 } else { | 1194 } else { |
1157 user_write_buf_ = NULL; | 1195 user_write_buf_ = NULL; |
1158 user_write_buf_len_ = 0; | 1196 user_write_buf_len_ = 0; |
1159 | 1197 |
1160 if (!OnNetworkTaskRunner()) { | 1198 if (!OnNetworkTaskRunner()) { |
1199 PostOrRunCallback(FROM_HERE, base::Bind(&Core::DidNSSWrite, this, rv)); | |
1161 PostOrRunCallback(FROM_HERE, base::Bind(callback, rv)); | 1200 PostOrRunCallback(FROM_HERE, base::Bind(callback, rv)); |
1162 return ERR_IO_PENDING; | 1201 return ERR_IO_PENDING; |
1202 } else { | |
1203 DCHECK(!nss_waiting_write_); | |
1204 if (rv < 0) | |
1205 nss_is_closed_ = true; | |
1163 } | 1206 } |
1164 } | 1207 } |
1165 | 1208 |
1166 return rv; | 1209 return rv; |
1167 } | 1210 } |
1168 | 1211 |
1212 bool SSLClientSocketNSS::Core::IsConnected() { | |
1213 DCHECK(OnNetworkTaskRunner()); | |
1214 return !nss_is_closed_; | |
1215 } | |
1216 | |
1217 bool SSLClientSocketNSS::Core::HasPendingAsyncOperation() { | |
1218 DCHECK(OnNetworkTaskRunner()); | |
1219 return nss_waiting_read_ || nss_waiting_write_; | |
1220 } | |
1221 | |
1222 bool SSLClientSocketNSS::Core::HasUnhandledReceivedData() { | |
1223 DCHECK(OnNetworkTaskRunner()); | |
1224 return unhandled_buffer_size_ != 0; | |
1225 } | |
1226 | |
1169 bool SSLClientSocketNSS::Core::OnNSSTaskRunner() const { | 1227 bool SSLClientSocketNSS::Core::OnNSSTaskRunner() const { |
1170 return nss_task_runner_->RunsTasksOnCurrentThread(); | 1228 return nss_task_runner_->RunsTasksOnCurrentThread(); |
1171 } | 1229 } |
1172 | 1230 |
1173 bool SSLClientSocketNSS::Core::OnNetworkTaskRunner() const { | 1231 bool SSLClientSocketNSS::Core::OnNetworkTaskRunner() const { |
1174 return network_task_runner_->RunsTasksOnCurrentThread(); | 1232 return network_task_runner_->RunsTasksOnCurrentThread(); |
1175 } | 1233 } |
1176 | 1234 |
1177 // static | 1235 // static |
1178 SECStatus SSLClientSocketNSS::Core::OwnAuthCertHandler( | 1236 SECStatus SSLClientSocketNSS::Core::OwnAuthCertHandler( |
(...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2037 GotoState(STATE_HANDSHAKE); | 2095 GotoState(STATE_HANDSHAKE); |
2038 return OK; | 2096 return OK; |
2039 } | 2097 } |
2040 | 2098 |
2041 int SSLClientSocketNSS::Core::DoPayloadRead() { | 2099 int SSLClientSocketNSS::Core::DoPayloadRead() { |
2042 DCHECK(OnNSSTaskRunner()); | 2100 DCHECK(OnNSSTaskRunner()); |
2043 DCHECK(user_read_buf_); | 2101 DCHECK(user_read_buf_); |
2044 DCHECK_GT(user_read_buf_len_, 0); | 2102 DCHECK_GT(user_read_buf_len_, 0); |
2045 | 2103 |
2046 int rv = PR_Read(nss_fd_, user_read_buf_->data(), user_read_buf_len_); | 2104 int rv = PR_Read(nss_fd_, user_read_buf_->data(), user_read_buf_len_); |
2105 // Update NSSTaskRunner status because PR_Read may consume |nss_bufs_|, then | |
2106 // following |amount_in_read_buffer| may be changed here. | |
2107 int amount_in_read_buffer = memio_GetReadableBufferSize(nss_bufs_); | |
2108 PostOrRunCallback( | |
2109 FROM_HERE, | |
2110 base::Bind(&Core::OnNSSBufferUpdated, this, amount_in_read_buffer)); | |
2111 | |
2047 if (client_auth_cert_needed_) { | 2112 if (client_auth_cert_needed_) { |
2048 // We don't need to invalidate the non-client-authenticated SSL session | 2113 // We don't need to invalidate the non-client-authenticated SSL session |
2049 // because the server will renegotiate anyway. | 2114 // because the server will renegotiate anyway. |
2050 rv = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; | 2115 rv = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; |
2051 PostOrRunCallback( | 2116 PostOrRunCallback( |
2052 FROM_HERE, | 2117 FROM_HERE, |
2053 base::Bind(&AddLogEventWithCallback, weak_net_log_, | 2118 base::Bind(&AddLogEventWithCallback, weak_net_log_, |
2054 NetLog::TYPE_SSL_READ_ERROR, | 2119 NetLog::TYPE_SSL_READ_ERROR, |
2055 CreateNetLogSSLErrorCallback(rv, 0))); | 2120 CreateNetLogSSLErrorCallback(rv, 0))); |
2056 return rv; | 2121 return rv; |
(...skipping 17 matching lines...) Expand all Loading... | |
2074 NetLog::TYPE_SSL_READ_ERROR, | 2139 NetLog::TYPE_SSL_READ_ERROR, |
2075 CreateNetLogSSLErrorCallback(rv, prerr))); | 2140 CreateNetLogSSLErrorCallback(rv, prerr))); |
2076 return rv; | 2141 return rv; |
2077 } | 2142 } |
2078 | 2143 |
2079 int SSLClientSocketNSS::Core::DoPayloadWrite() { | 2144 int SSLClientSocketNSS::Core::DoPayloadWrite() { |
2080 DCHECK(OnNSSTaskRunner()); | 2145 DCHECK(OnNSSTaskRunner()); |
2081 | 2146 |
2082 DCHECK(user_write_buf_); | 2147 DCHECK(user_write_buf_); |
2083 | 2148 |
2149 int old_amount_in_read_buffer = memio_GetReadableBufferSize(nss_bufs_); | |
2084 int rv = PR_Write(nss_fd_, user_write_buf_->data(), user_write_buf_len_); | 2150 int rv = PR_Write(nss_fd_, user_write_buf_->data(), user_write_buf_len_); |
2151 int new_amount_in_read_buffer = memio_GetReadableBufferSize(nss_bufs_); | |
2152 // PR_Write could potentially consume the unhandled data in the memio read | |
2153 // buffer if a renegotiation is in progress. If the buffer is consumed, | |
2154 // notify the latest buffer size to NetworkRunner. | |
2155 if (old_amount_in_read_buffer != new_amount_in_read_buffer) { | |
2156 PostOrRunCallback( | |
2157 FROM_HERE, | |
2158 base::Bind(&Core::OnNSSBufferUpdated, this, new_amount_in_read_buffer)); | |
2159 } | |
2085 if (rv >= 0) { | 2160 if (rv >= 0) { |
2086 PostOrRunCallback( | 2161 PostOrRunCallback( |
2087 FROM_HERE, | 2162 FROM_HERE, |
2088 base::Bind(&LogByteTransferEvent, weak_net_log_, | 2163 base::Bind(&LogByteTransferEvent, weak_net_log_, |
2089 NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, | 2164 NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, |
2090 scoped_refptr<IOBuffer>(user_write_buf_))); | 2165 scoped_refptr<IOBuffer>(user_write_buf_))); |
2091 return rv; | 2166 return rv; |
2092 } | 2167 } |
2093 PRErrorCode prerr = PR_GetError(); | 2168 PRErrorCode prerr = PR_GetError(); |
2094 if (prerr == PR_WOULD_BLOCK_ERROR) | 2169 if (prerr == PR_WOULD_BLOCK_ERROR) |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2280 PostOrRunCallback(FROM_HERE, c); | 2355 PostOrRunCallback(FROM_HERE, c); |
2281 } | 2356 } |
2282 | 2357 |
2283 void SSLClientSocketNSS::Core::DoReadCallback(int rv) { | 2358 void SSLClientSocketNSS::Core::DoReadCallback(int rv) { |
2284 DCHECK(OnNSSTaskRunner()); | 2359 DCHECK(OnNSSTaskRunner()); |
2285 DCHECK_NE(ERR_IO_PENDING, rv); | 2360 DCHECK_NE(ERR_IO_PENDING, rv); |
2286 DCHECK(!user_read_callback_.is_null()); | 2361 DCHECK(!user_read_callback_.is_null()); |
2287 | 2362 |
2288 user_read_buf_ = NULL; | 2363 user_read_buf_ = NULL; |
2289 user_read_buf_len_ = 0; | 2364 user_read_buf_len_ = 0; |
2290 base::Closure c = base::Bind( | 2365 int amount_in_read_buffer = memio_GetReadableBufferSize(nss_bufs_); |
2291 base::ResetAndReturn(&user_read_callback_), | 2366 // This is used to curry the |amount_int_read_buffer| and |user_cb| back to |
2292 rv); | 2367 // the network task runner. |
2293 PostOrRunCallback(FROM_HERE, c); | 2368 PostOrRunCallback( |
2369 FROM_HERE, | |
2370 base::Bind(&Core::OnNSSBufferUpdated, this, amount_in_read_buffer)); | |
2371 PostOrRunCallback( | |
2372 FROM_HERE, | |
2373 base::Bind(&Core::DidNSSRead, this, rv)); | |
2374 PostOrRunCallback( | |
2375 FROM_HERE, | |
2376 base::Bind(base::ResetAndReturn(&user_read_callback_), rv)); | |
2294 } | 2377 } |
2295 | 2378 |
2296 void SSLClientSocketNSS::Core::DoWriteCallback(int rv) { | 2379 void SSLClientSocketNSS::Core::DoWriteCallback(int rv) { |
2297 DCHECK(OnNSSTaskRunner()); | 2380 DCHECK(OnNSSTaskRunner()); |
2298 DCHECK_NE(ERR_IO_PENDING, rv); | 2381 DCHECK_NE(ERR_IO_PENDING, rv); |
2299 DCHECK(!user_write_callback_.is_null()); | 2382 DCHECK(!user_write_callback_.is_null()); |
2300 | 2383 |
2301 // Since Run may result in Write being called, clear |user_write_callback_| | 2384 // Since Run may result in Write being called, clear |user_write_callback_| |
2302 // up front. | 2385 // up front. |
2303 user_write_buf_ = NULL; | 2386 user_write_buf_ = NULL; |
2304 user_write_buf_len_ = 0; | 2387 user_write_buf_len_ = 0; |
2305 base::Closure c = base::Bind( | 2388 // Update buffer status because DoWriteLoop called DoTransportIO which may |
2306 base::ResetAndReturn(&user_write_callback_), | 2389 // perform read operations. |
2307 rv); | 2390 int amount_in_read_buffer = memio_GetReadableBufferSize(nss_bufs_); |
2308 PostOrRunCallback(FROM_HERE, c); | 2391 // This will invoke the user callback with |rv| as result. |
2392 base::Closure user_cb = base::Bind( | |
2393 base::ResetAndReturn(&user_write_callback_), rv); | |
2394 // This is used to curry the |amount_int_read_buffer| and |user_cb| back to | |
2395 // the network task runner. | |
2396 PostOrRunCallback( | |
2397 FROM_HERE, | |
2398 base::Bind(&Core::OnNSSBufferUpdated, this, amount_in_read_buffer)); | |
2399 PostOrRunCallback( | |
2400 FROM_HERE, | |
2401 base::Bind(&Core::DidNSSWrite, this, rv)); | |
2402 PostOrRunCallback( | |
2403 FROM_HERE, | |
2404 base::Bind(base::ResetAndReturn(&user_read_callback_), rv)); | |
Ryan Sleevi
2013/01/23 20:12:55
BUG: You copy/pasted the wrong bit here. This shou
Takashi Toyoshima
2013/01/25 06:32:39
Oops, sorry for a silly mistake.
| |
2309 } | 2405 } |
2310 | 2406 |
2311 SECStatus SSLClientSocketNSS::Core::ClientChannelIDHandler( | 2407 SECStatus SSLClientSocketNSS::Core::ClientChannelIDHandler( |
2312 void* arg, | 2408 void* arg, |
2313 PRFileDesc* socket, | 2409 PRFileDesc* socket, |
2314 SECKEYPublicKey **out_public_key, | 2410 SECKEYPublicKey **out_public_key, |
2315 SECKEYPrivateKey **out_private_key) { | 2411 SECKEYPrivateKey **out_private_key) { |
2316 Core* core = reinterpret_cast<Core*>(arg); | 2412 Core* core = reinterpret_cast<Core*>(arg); |
2317 DCHECK(core->OnNSSTaskRunner()); | 2413 DCHECK(core->OnNSSTaskRunner()); |
2318 | 2414 |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2558 } | 2654 } |
2559 | 2655 |
2560 int SSLClientSocketNSS::Core::DoBufferSend(IOBuffer* send_buffer, int len) { | 2656 int SSLClientSocketNSS::Core::DoBufferSend(IOBuffer* send_buffer, int len) { |
2561 DCHECK(OnNetworkTaskRunner()); | 2657 DCHECK(OnNetworkTaskRunner()); |
2562 DCHECK_GT(len, 0); | 2658 DCHECK_GT(len, 0); |
2563 | 2659 |
2564 if (detached_) | 2660 if (detached_) |
2565 return ERR_ABORTED; | 2661 return ERR_ABORTED; |
2566 | 2662 |
2567 int rv = transport_->socket()->Write( | 2663 int rv = transport_->socket()->Write( |
2568 send_buffer, len, | 2664 send_buffer, len, |
2569 base::Bind(&Core::BufferSendComplete, | 2665 base::Bind(&Core::BufferSendComplete, |
2570 base::Unretained(this))); | 2666 base::Unretained(this))); |
2571 | 2667 |
2572 if (!OnNSSTaskRunner() && rv != ERR_IO_PENDING) { | 2668 if (!OnNSSTaskRunner() && rv != ERR_IO_PENDING) { |
2573 nss_task_runner_->PostTask( | 2669 nss_task_runner_->PostTask( |
2574 FROM_HERE, | 2670 FROM_HERE, |
2575 base::Bind(&Core::BufferSendComplete, this, rv)); | 2671 base::Bind(&Core::BufferSendComplete, this, rv)); |
2576 return rv; | 2672 return rv; |
2577 } | 2673 } |
2578 | 2674 |
2579 return rv; | 2675 return rv; |
2580 } | 2676 } |
(...skipping 22 matching lines...) Expand all Loading... | |
2603 FROM_HERE, | 2699 FROM_HERE, |
2604 base::Bind(&Core::OnHandshakeIOComplete, this, rv)); | 2700 base::Bind(&Core::OnHandshakeIOComplete, this, rv)); |
2605 return ERR_IO_PENDING; | 2701 return ERR_IO_PENDING; |
2606 } | 2702 } |
2607 | 2703 |
2608 return rv; | 2704 return rv; |
2609 } | 2705 } |
2610 | 2706 |
2611 void SSLClientSocketNSS::Core::OnHandshakeStateUpdated( | 2707 void SSLClientSocketNSS::Core::OnHandshakeStateUpdated( |
2612 const HandshakeState& state) { | 2708 const HandshakeState& state) { |
2709 DCHECK(OnNetworkTaskRunner()); | |
2613 network_handshake_state_ = state; | 2710 network_handshake_state_ = state; |
2614 } | 2711 } |
2615 | 2712 |
2713 void SSLClientSocketNSS::Core::OnNSSBufferUpdated(int amount_in_read_buffer) { | |
2714 DCHECK(OnNetworkTaskRunner()); | |
2715 unhandled_buffer_size_ = amount_in_read_buffer; | |
2716 } | |
2717 | |
2718 void SSLClientSocketNSS::Core::DidNSSRead(int result) { | |
2719 DCHECK(OnNetworkTaskRunner()); | |
2720 DCHECK(nss_waiting_read_); | |
2721 nss_waiting_read_ = false; | |
2722 if (result <= 0) | |
2723 nss_is_closed_ = true; | |
2724 } | |
2725 | |
2726 void SSLClientSocketNSS::Core::DidNSSWrite(int result) { | |
2727 DCHECK(OnNetworkTaskRunner()); | |
2728 DCHECK(nss_waiting_write_); | |
2729 nss_waiting_write_ = false; | |
2730 if (result < 0) | |
2731 nss_is_closed_ = true; | |
2732 } | |
2733 | |
2616 void SSLClientSocketNSS::Core::BufferSendComplete(int result) { | 2734 void SSLClientSocketNSS::Core::BufferSendComplete(int result) { |
2617 if (!OnNSSTaskRunner()) { | 2735 if (!OnNSSTaskRunner()) { |
2618 if (detached_) | 2736 if (detached_) |
2619 return; | 2737 return; |
2620 | 2738 |
2621 nss_task_runner_->PostTask( | 2739 nss_task_runner_->PostTask( |
2622 FROM_HERE, base::Bind(&Core::BufferSendComplete, this, result)); | 2740 FROM_HERE, base::Bind(&Core::BufferSendComplete, this, result)); |
2623 return; | 2741 return; |
2624 } | 2742 } |
2625 | 2743 |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2915 user_connect_callback_.Reset(); | 3033 user_connect_callback_.Reset(); |
2916 server_cert_verify_result_.Reset(); | 3034 server_cert_verify_result_.Reset(); |
2917 completed_handshake_ = false; | 3035 completed_handshake_ = false; |
2918 start_cert_verification_time_ = base::TimeTicks(); | 3036 start_cert_verification_time_ = base::TimeTicks(); |
2919 InitCore(); | 3037 InitCore(); |
2920 | 3038 |
2921 LeaveFunction(""); | 3039 LeaveFunction(""); |
2922 } | 3040 } |
2923 | 3041 |
2924 bool SSLClientSocketNSS::IsConnected() const { | 3042 bool SSLClientSocketNSS::IsConnected() const { |
2925 // Ideally, we should also check if we have received the close_notify alert | |
2926 // message from the server, and return false in that case. We're not doing | |
2927 // that, so this function may return a false positive. Since the upper | |
2928 // layer (HttpNetworkTransaction) needs to handle a persistent connection | |
2929 // closed by the server when we send a request anyway, a false positive in | |
2930 // exchange for simpler code is a good trade-off. | |
2931 EnterFunction(""); | 3043 EnterFunction(""); |
2932 bool ret = completed_handshake_ && transport_->socket()->IsConnected(); | 3044 bool ret = completed_handshake_ && |
3045 (core_->HasPendingAsyncOperation() || | |
3046 (core_->IsConnected() && core_->HasUnhandledReceivedData()) || | |
3047 transport_->socket()->IsConnected()); | |
2933 LeaveFunction(""); | 3048 LeaveFunction(""); |
2934 return ret; | 3049 return ret; |
2935 } | 3050 } |
2936 | 3051 |
2937 bool SSLClientSocketNSS::IsConnectedAndIdle() const { | 3052 bool SSLClientSocketNSS::IsConnectedAndIdle() const { |
2938 // Unlike IsConnected, this method doesn't return a false positive. | |
2939 // | |
2940 // Strictly speaking, we should check if we have received the close_notify | |
2941 // alert message from the server, and return false in that case. Although | |
2942 // the close_notify alert message means EOF in the SSL layer, it is just | |
2943 // bytes to the transport layer below, so | |
2944 // transport_->socket()->IsConnectedAndIdle() returns the desired false | |
2945 // when we receive close_notify. | |
2946 EnterFunction(""); | 3053 EnterFunction(""); |
2947 bool ret = completed_handshake_ && transport_->socket()->IsConnectedAndIdle(); | 3054 bool ret = completed_handshake_ && |
3055 !core_->HasPendingAsyncOperation() && | |
3056 !(core_->IsConnected() && core_->HasUnhandledReceivedData()) && | |
3057 transport_->socket()->IsConnectedAndIdle(); | |
2948 LeaveFunction(""); | 3058 LeaveFunction(""); |
2949 return ret; | 3059 return ret; |
2950 } | 3060 } |
2951 | 3061 |
2952 int SSLClientSocketNSS::GetPeerAddress(IPEndPoint* address) const { | 3062 int SSLClientSocketNSS::GetPeerAddress(IPEndPoint* address) const { |
2953 return transport_->socket()->GetPeerAddress(address); | 3063 return transport_->socket()->GetPeerAddress(address); |
2954 } | 3064 } |
2955 | 3065 |
2956 int SSLClientSocketNSS::GetLocalAddress(IPEndPoint* address) const { | 3066 int SSLClientSocketNSS::GetLocalAddress(IPEndPoint* address) const { |
2957 return transport_->socket()->GetLocalAddress(address); | 3067 return transport_->socket()->GetLocalAddress(address); |
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3491 EnsureThreadIdAssigned(); | 3601 EnsureThreadIdAssigned(); |
3492 base::AutoLock auto_lock(lock_); | 3602 base::AutoLock auto_lock(lock_); |
3493 return valid_thread_id_ == base::PlatformThread::CurrentId(); | 3603 return valid_thread_id_ == base::PlatformThread::CurrentId(); |
3494 } | 3604 } |
3495 | 3605 |
3496 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { | 3606 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { |
3497 return server_bound_cert_service_; | 3607 return server_bound_cert_service_; |
3498 } | 3608 } |
3499 | 3609 |
3500 } // namespace net | 3610 } // namespace net |
OLD | NEW |