Index: net/socket/ssl_client_socket_nss.cc |
=================================================================== |
--- net/socket/ssl_client_socket_nss.cc (revision 137212) |
+++ net/socket/ssl_client_socket_nss.cc (working copy) |
@@ -430,6 +430,7 @@ |
const SSLClientSocketContext& context) |
: transport_send_busy_(false), |
transport_recv_busy_(false), |
+ transport_eof_(false), |
transport_(transport_socket), |
host_and_port_(host_and_port), |
ssl_config_(ssl_config), |
@@ -633,6 +634,7 @@ |
user_write_callback_.Reset(); |
transport_send_busy_ = false; |
transport_recv_busy_ = false; |
+ transport_eof_ = false; |
user_read_buf_ = NULL; |
user_read_buf_len_ = 0; |
user_write_buf_ = NULL; |
@@ -1219,6 +1221,7 @@ |
network_moved = DoTransportIO(); |
} while (rv_read == ERR_IO_PENDING && |
rv_write == ERR_IO_PENDING && |
+ (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
|
network_moved); |
if (user_read_buf_ && rv_read != ERR_IO_PENDING) |
@@ -1922,7 +1925,9 @@ |
if (rv > 0) |
network_moved = true; |
} while (rv > 0); |
- if (BufferRecv() >= 0) |
+ bool reached_eof = transport_eof_; |
+ 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
|
+ if (rv > 0 || (!reached_eof && rv == 0)) |
network_moved = true; |
} |
LeaveFunction(network_moved); |
@@ -1990,8 +1995,11 @@ |
if (rv == ERR_IO_PENDING) { |
transport_recv_busy_ = true; |
} else { |
- if (rv > 0) |
+ if (rv > 0) { |
memcpy(buf, recv_buffer_->data(), rv); |
+ } else if (rv == 0) { |
+ transport_eof_ = true; |
+ } |
memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); |
recv_buffer_ = NULL; |
} |
@@ -2006,6 +2014,8 @@ |
char* buf; |
memio_GetReadParams(nss_bufs_, &buf); |
memcpy(buf, recv_buffer_->data(), result); |
+ } else if (result == 0) { |
+ transport_eof_ = true; |
} |
recv_buffer_ = NULL; |
memio_PutReadResult(nss_bufs_, MapErrorToNSS(result)); |