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

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: Make changes suggested by rsleevi, exclude SSLClientSocketOpenSSL from this CL 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
« no previous file with comments | « net/socket/ssl_client_socket_nss.h ('k') | net/socket/ssl_server_socket_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_recv_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_recv_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_) &&
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 if (!transport_recv_eof_ && BufferRecv() >= 0)
1926 network_moved = true; 1929 network_moved = true;
1927 } 1930 }
1928 LeaveFunction(network_moved); 1931 LeaveFunction(network_moved);
1929 return network_moved; 1932 return network_moved;
1930 } 1933 }
1931 1934
1932 // Return 0 for EOF, 1935 // Return 0 for EOF,
1933 // > 0 for bytes transferred immediately, 1936 // > 0 for bytes transferred immediately,
1934 // < 0 for error (or the non-error ERR_IO_PENDING). 1937 // < 0 for error (or the non-error ERR_IO_PENDING).
1935 int SSLClientSocketNSS::BufferSend(void) { 1938 int SSLClientSocketNSS::BufferSend() {
1936 if (transport_send_busy_) 1939 if (transport_send_busy_)
1937 return ERR_IO_PENDING; 1940 return ERR_IO_PENDING;
1938 1941
1939 EnterFunction(""); 1942 EnterFunction("");
1940 const char* buf1; 1943 const char* buf1;
1941 const char* buf2; 1944 const char* buf2;
1942 unsigned int len1, len2; 1945 unsigned int len1, len2;
1943 memio_GetWriteParams(nss_bufs_, &buf1, &len1, &buf2, &len2); 1946 memio_GetWriteParams(nss_bufs_, &buf1, &len1, &buf2, &len2);
1944 const unsigned int len = len1 + len2; 1947 const unsigned int len = len1 + len2;
1945 1948
(...skipping 18 matching lines...) Expand all
1964 } 1967 }
1965 1968
1966 void SSLClientSocketNSS::BufferSendComplete(int result) { 1969 void SSLClientSocketNSS::BufferSendComplete(int result) {
1967 EnterFunction(result); 1970 EnterFunction(result);
1968 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(result)); 1971 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(result));
1969 transport_send_busy_ = false; 1972 transport_send_busy_ = false;
1970 OnSendComplete(result); 1973 OnSendComplete(result);
1971 LeaveFunction(""); 1974 LeaveFunction("");
1972 } 1975 }
1973 1976
1974 int SSLClientSocketNSS::BufferRecv(void) { 1977 int SSLClientSocketNSS::BufferRecv() {
1975 if (transport_recv_busy_) return ERR_IO_PENDING; 1978 if (transport_recv_busy_) return ERR_IO_PENDING;
1976 1979
1977 char* buf; 1980 char* buf;
1978 int nb = memio_GetReadParams(nss_bufs_, &buf); 1981 int nb = memio_GetReadParams(nss_bufs_, &buf);
1979 EnterFunction(nb); 1982 EnterFunction(nb);
1980 int rv; 1983 int rv;
1981 if (!nb) { 1984 if (!nb) {
1982 // buffer too full to read into, so no I/O possible at moment 1985 // buffer too full to read into, so no I/O possible at moment
1983 rv = ERR_IO_PENDING; 1986 rv = ERR_IO_PENDING;
1984 } else { 1987 } else {
1985 recv_buffer_ = new IOBuffer(nb); 1988 recv_buffer_ = new IOBuffer(nb);
1986 rv = transport_->socket()->Read( 1989 rv = transport_->socket()->Read(
1987 recv_buffer_, nb, 1990 recv_buffer_, nb,
1988 base::Bind(&SSLClientSocketNSS::BufferRecvComplete, 1991 base::Bind(&SSLClientSocketNSS::BufferRecvComplete,
1989 base::Unretained(this))); 1992 base::Unretained(this)));
1990 if (rv == ERR_IO_PENDING) { 1993 if (rv == ERR_IO_PENDING) {
1991 transport_recv_busy_ = true; 1994 transport_recv_busy_ = true;
1992 } else { 1995 } else {
1993 if (rv > 0) 1996 if (rv > 0) {
1994 memcpy(buf, recv_buffer_->data(), rv); 1997 memcpy(buf, recv_buffer_->data(), rv);
1998 } else if (rv == 0) {
1999 transport_recv_eof_ = true;
2000 }
1995 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); 2001 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv));
1996 recv_buffer_ = NULL; 2002 recv_buffer_ = NULL;
1997 } 2003 }
1998 } 2004 }
1999 LeaveFunction(rv); 2005 LeaveFunction(rv);
2000 return rv; 2006 return rv;
2001 } 2007 }
2002 2008
2003 void SSLClientSocketNSS::BufferRecvComplete(int result) { 2009 void SSLClientSocketNSS::BufferRecvComplete(int result) {
2004 EnterFunction(result); 2010 EnterFunction(result);
2005 if (result > 0) { 2011 if (result > 0) {
2006 char* buf; 2012 char* buf;
2007 memio_GetReadParams(nss_bufs_, &buf); 2013 memio_GetReadParams(nss_bufs_, &buf);
2008 memcpy(buf, recv_buffer_->data(), result); 2014 memcpy(buf, recv_buffer_->data(), result);
2015 } else if (result == 0) {
2016 transport_recv_eof_ = true;
2009 } 2017 }
2010 recv_buffer_ = NULL; 2018 recv_buffer_ = NULL;
2011 memio_PutReadResult(nss_bufs_, MapErrorToNSS(result)); 2019 memio_PutReadResult(nss_bufs_, MapErrorToNSS(result));
2012 transport_recv_busy_ = false; 2020 transport_recv_busy_ = false;
2013 OnRecvComplete(result); 2021 OnRecvComplete(result);
2014 LeaveFunction(""); 2022 LeaveFunction("");
2015 } 2023 }
2016 2024
2017 int SSLClientSocketNSS::HandleNSSError(PRErrorCode nss_error, 2025 int SSLClientSocketNSS::HandleNSSError(PRErrorCode nss_error,
2018 bool handshake_error) { 2026 bool handshake_error) {
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after
2640 EnsureThreadIdAssigned(); 2648 EnsureThreadIdAssigned();
2641 base::AutoLock auto_lock(lock_); 2649 base::AutoLock auto_lock(lock_);
2642 return valid_thread_id_ == base::PlatformThread::CurrentId(); 2650 return valid_thread_id_ == base::PlatformThread::CurrentId();
2643 } 2651 }
2644 2652
2645 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { 2653 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const {
2646 return server_bound_cert_service_; 2654 return server_bound_cert_service_;
2647 } 2655 }
2648 2656
2649 } // namespace net 2657 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_nss.h ('k') | net/socket/ssl_server_socket_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698