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 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
423 | 423 |
424 } // namespace | 424 } // namespace |
425 | 425 |
426 SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket, | 426 SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket, |
427 const HostPortPair& host_and_port, | 427 const HostPortPair& host_and_port, |
428 const SSLConfig& ssl_config, | 428 const SSLConfig& ssl_config, |
429 SSLHostInfo* ssl_host_info, | 429 SSLHostInfo* ssl_host_info, |
430 const SSLClientSocketContext& context) | 430 const SSLClientSocketContext& context) |
431 : transport_send_busy_(false), | 431 : transport_send_busy_(false), |
432 transport_recv_busy_(false), | 432 transport_recv_busy_(false), |
433 transport_eof_(false), | |
433 transport_(transport_socket), | 434 transport_(transport_socket), |
434 host_and_port_(host_and_port), | 435 host_and_port_(host_and_port), |
435 ssl_config_(ssl_config), | 436 ssl_config_(ssl_config), |
436 user_read_buf_len_(0), | 437 user_read_buf_len_(0), |
437 user_write_buf_len_(0), | 438 user_write_buf_len_(0), |
438 server_cert_nss_(NULL), | 439 server_cert_nss_(NULL), |
439 server_cert_verify_result_(NULL), | 440 server_cert_verify_result_(NULL), |
440 ssl_connection_status_(0), | 441 ssl_connection_status_(0), |
441 client_auth_cert_needed_(false), | 442 client_auth_cert_needed_(false), |
442 cert_verifier_(context.cert_verifier), | 443 cert_verifier_(context.cert_verifier), |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
626 PR_Close(nss_fd_); | 627 PR_Close(nss_fd_); |
627 nss_fd_ = NULL; | 628 nss_fd_ = NULL; |
628 } | 629 } |
629 | 630 |
630 // Reset object state. | 631 // Reset object state. |
631 user_connect_callback_.Reset(); | 632 user_connect_callback_.Reset(); |
632 user_read_callback_.Reset(); | 633 user_read_callback_.Reset(); |
633 user_write_callback_.Reset(); | 634 user_write_callback_.Reset(); |
634 transport_send_busy_ = false; | 635 transport_send_busy_ = false; |
635 transport_recv_busy_ = false; | 636 transport_recv_busy_ = false; |
637 transport_eof_ = false; | |
636 user_read_buf_ = NULL; | 638 user_read_buf_ = NULL; |
637 user_read_buf_len_ = 0; | 639 user_read_buf_len_ = 0; |
638 user_write_buf_ = NULL; | 640 user_write_buf_ = NULL; |
639 user_write_buf_len_ = 0; | 641 user_write_buf_len_ = 0; |
640 server_cert_ = NULL; | 642 server_cert_ = NULL; |
641 if (server_cert_nss_) { | 643 if (server_cert_nss_) { |
642 CERT_DestroyCertificate(server_cert_nss_); | 644 CERT_DestroyCertificate(server_cert_nss_); |
643 server_cert_nss_ = NULL; | 645 server_cert_nss_ = NULL; |
644 } | 646 } |
645 local_server_cert_verify_result_.Reset(); | 647 local_server_cert_verify_result_.Reset(); |
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1212 int rv_write = ERR_IO_PENDING; | 1214 int rv_write = ERR_IO_PENDING; |
1213 bool network_moved; | 1215 bool network_moved; |
1214 do { | 1216 do { |
1215 if (user_read_buf_) | 1217 if (user_read_buf_) |
1216 rv_read = DoPayloadRead(); | 1218 rv_read = DoPayloadRead(); |
1217 if (user_write_buf_) | 1219 if (user_write_buf_) |
1218 rv_write = DoPayloadWrite(); | 1220 rv_write = DoPayloadWrite(); |
1219 network_moved = DoTransportIO(); | 1221 network_moved = DoTransportIO(); |
1220 } while (rv_read == ERR_IO_PENDING && | 1222 } while (rv_read == ERR_IO_PENDING && |
1221 rv_write == ERR_IO_PENDING && | 1223 rv_write == ERR_IO_PENDING && |
1224 (user_read_buf_ || user_write_buf_) && | |
Ryan Sleevi
2012/05/16 02:13:03
Double checking my understanding here.
Pre-condit
wtc
2012/05/16 03:04:29
This turns out to be false. While investigating t
Ryan Sleevi
2012/05/16 03:44:11
Ok, I think I've reasoned about this check. It sti
wtc
2012/05/16 17:51:52
You are right that the (user_read_buf_ || user_wri
| |
1222 network_moved); | 1225 network_moved); |
1223 | 1226 |
1224 if (user_read_buf_ && rv_read != ERR_IO_PENDING) | 1227 if (user_read_buf_ && rv_read != ERR_IO_PENDING) |
1225 DoReadCallback(rv_read); | 1228 DoReadCallback(rv_read); |
1226 if (user_write_buf_ && rv_write != ERR_IO_PENDING) | 1229 if (user_write_buf_ && rv_write != ERR_IO_PENDING) |
1227 DoWriteCallback(rv_write); | 1230 DoWriteCallback(rv_write); |
1228 | 1231 |
1229 LeaveFunction(""); | 1232 LeaveFunction(""); |
1230 } | 1233 } |
1231 | 1234 |
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1915 bool network_moved = false; | 1918 bool network_moved = false; |
1916 if (nss_bufs_ != NULL) { | 1919 if (nss_bufs_ != NULL) { |
1917 int rv; | 1920 int rv; |
1918 // Read and write as much data as we can. The loop is neccessary | 1921 // Read and write as much data as we can. The loop is neccessary |
1919 // because Write() may return synchronously. | 1922 // because Write() may return synchronously. |
1920 do { | 1923 do { |
1921 rv = BufferSend(); | 1924 rv = BufferSend(); |
1922 if (rv > 0) | 1925 if (rv > 0) |
1923 network_moved = true; | 1926 network_moved = true; |
1924 } while (rv > 0); | 1927 } while (rv > 0); |
1925 if (BufferRecv() >= 0) | 1928 bool reached_eof = transport_eof_; |
1929 rv = BufferRecv(); | |
Ryan Sleevi
2012/05/16 02:13:03
If we'd previously reached eof, why call BufferRec
wtc
2012/05/16 03:04:29
Ah, you're right. Not calling BufferRecv if we'd
| |
1930 if (rv > 0 || (!reached_eof && rv == 0)) | |
1926 network_moved = true; | 1931 network_moved = true; |
1927 } | 1932 } |
1928 LeaveFunction(network_moved); | 1933 LeaveFunction(network_moved); |
1929 return network_moved; | 1934 return network_moved; |
1930 } | 1935 } |
1931 | 1936 |
1932 // Return 0 for EOF, | 1937 // Return 0 for EOF, |
1933 // > 0 for bytes transferred immediately, | 1938 // > 0 for bytes transferred immediately, |
1934 // < 0 for error (or the non-error ERR_IO_PENDING). | 1939 // < 0 for error (or the non-error ERR_IO_PENDING). |
1935 int SSLClientSocketNSS::BufferSend(void) { | 1940 int SSLClientSocketNSS::BufferSend(void) { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1983 rv = ERR_IO_PENDING; | 1988 rv = ERR_IO_PENDING; |
1984 } else { | 1989 } else { |
1985 recv_buffer_ = new IOBuffer(nb); | 1990 recv_buffer_ = new IOBuffer(nb); |
1986 rv = transport_->socket()->Read( | 1991 rv = transport_->socket()->Read( |
1987 recv_buffer_, nb, | 1992 recv_buffer_, nb, |
1988 base::Bind(&SSLClientSocketNSS::BufferRecvComplete, | 1993 base::Bind(&SSLClientSocketNSS::BufferRecvComplete, |
1989 base::Unretained(this))); | 1994 base::Unretained(this))); |
1990 if (rv == ERR_IO_PENDING) { | 1995 if (rv == ERR_IO_PENDING) { |
1991 transport_recv_busy_ = true; | 1996 transport_recv_busy_ = true; |
1992 } else { | 1997 } else { |
1993 if (rv > 0) | 1998 if (rv > 0) { |
1994 memcpy(buf, recv_buffer_->data(), rv); | 1999 memcpy(buf, recv_buffer_->data(), rv); |
2000 } else if (rv == 0) { | |
2001 transport_eof_ = true; | |
2002 } | |
1995 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); | 2003 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); |
1996 recv_buffer_ = NULL; | 2004 recv_buffer_ = NULL; |
1997 } | 2005 } |
1998 } | 2006 } |
1999 LeaveFunction(rv); | 2007 LeaveFunction(rv); |
2000 return rv; | 2008 return rv; |
2001 } | 2009 } |
2002 | 2010 |
2003 void SSLClientSocketNSS::BufferRecvComplete(int result) { | 2011 void SSLClientSocketNSS::BufferRecvComplete(int result) { |
2004 EnterFunction(result); | 2012 EnterFunction(result); |
2005 if (result > 0) { | 2013 if (result > 0) { |
2006 char* buf; | 2014 char* buf; |
2007 memio_GetReadParams(nss_bufs_, &buf); | 2015 memio_GetReadParams(nss_bufs_, &buf); |
2008 memcpy(buf, recv_buffer_->data(), result); | 2016 memcpy(buf, recv_buffer_->data(), result); |
2017 } else if (result == 0) { | |
2018 transport_eof_ = true; | |
2009 } | 2019 } |
2010 recv_buffer_ = NULL; | 2020 recv_buffer_ = NULL; |
2011 memio_PutReadResult(nss_bufs_, MapErrorToNSS(result)); | 2021 memio_PutReadResult(nss_bufs_, MapErrorToNSS(result)); |
2012 transport_recv_busy_ = false; | 2022 transport_recv_busy_ = false; |
2013 OnRecvComplete(result); | 2023 OnRecvComplete(result); |
2014 LeaveFunction(""); | 2024 LeaveFunction(""); |
2015 } | 2025 } |
2016 | 2026 |
2017 int SSLClientSocketNSS::HandleNSSError(PRErrorCode nss_error, | 2027 int SSLClientSocketNSS::HandleNSSError(PRErrorCode nss_error, |
2018 bool handshake_error) { | 2028 bool handshake_error) { |
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2640 EnsureThreadIdAssigned(); | 2650 EnsureThreadIdAssigned(); |
2641 base::AutoLock auto_lock(lock_); | 2651 base::AutoLock auto_lock(lock_); |
2642 return valid_thread_id_ == base::PlatformThread::CurrentId(); | 2652 return valid_thread_id_ == base::PlatformThread::CurrentId(); |
2643 } | 2653 } |
2644 | 2654 |
2645 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { | 2655 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { |
2646 return server_bound_cert_service_; | 2656 return server_bound_cert_service_; |
2647 } | 2657 } |
2648 | 2658 |
2649 } // namespace net | 2659 } // namespace net |
OLD | NEW |