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

Side by Side Diff: net/socket/ssl_client_socket_nss.cc

Issue 10382186: Prevent the infinite loop inside SSLClientSocketNSS::OnSendComplete. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Add SSLClientSocketOpenSSL fix Created 8 years, 7 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
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698