Index: net/socket/ssl_client_socket_nss.cc |
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc |
index 3a8b39e678c2785ea4d6fd7c60fea762fb599883..34bdf1b8fb5e120c9a095fb5dec52f2b56ac168f 100644 |
--- a/net/socket/ssl_client_socket_nss.cc |
+++ b/net/socket/ssl_client_socket_nss.cc |
@@ -890,6 +890,7 @@ class SSLClientSocketNSS::Core : public base::RefCountedThreadSafe<Core> { |
bool transport_recv_busy_; |
bool transport_recv_eof_; |
bool transport_send_busy_; |
+ int transport_send_error_; |
// Used by Read function. |
scoped_refptr<IOBuffer> user_read_buf_; |
@@ -956,6 +957,7 @@ SSLClientSocketNSS::Core::Core( |
transport_recv_busy_(false), |
transport_recv_eof_(false), |
transport_send_busy_(false), |
+ 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.
|
user_read_buf_len_(0), |
user_write_buf_len_(0), |
network_task_runner_(network_task_runner), |
@@ -2139,6 +2141,8 @@ int SSLClientSocketNSS::Core::BufferSend() { |
if (transport_send_busy_) |
return ERR_IO_PENDING; |
+ if (transport_send_error_ != 0) |
+ 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.
|
const char* buf1; |
const char* buf2; |
@@ -2704,6 +2708,12 @@ void SSLClientSocketNSS::Core::BufferSendComplete(int result) { |
memio_PutWriteResult(nss_bufs_, MapErrorToNSS(result)); |
transport_send_busy_ = false; |
+ // If there was an error, save the result on the NSS task runner. Future calls |
+ // to BufferSend will return the error synchronously rather than calling |
+ // DoBufferSend on the network task runner. This is important to prevent |
+ // 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.
|
+ if (result < 0) |
+ transport_send_error_ = result; |
OnSendComplete(result); |
} |