Chromium Code Reviews| 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 5e607782631a2b034445aff47800647420618b14..d13b2a9b9f5773b912b7dc8102da045428ae016b 100644 |
| --- a/net/socket/ssl_client_socket_nss.cc |
| +++ b/net/socket/ssl_client_socket_nss.cc |
| @@ -2265,11 +2265,29 @@ int SSLClientSocketNSS::DoVerifyCertComplete(int result) { |
| // session with a bad cert. |
| InvalidateSessionIfBadCertificate(); |
| - // Likewise, if we merged a Write call into the handshake we need to make the |
| + // If we merged a Write call into the handshake we need to make the |
| // callback now. |
| if (user_write_callback_) { |
| corked_ = false; |
| - DoWriteCallback(user_write_buf_len_); |
| + if (result != OK) { |
| + DoWriteCallback(result); |
| + } else { |
| + SSLSnapStartResult snap_start_type; |
| + SECStatus rv = SSL_GetSnapStartResult(nss_fd_, &snap_start_type); |
| + DCHECK_EQ(rv, SECSuccess); |
| + DCHECK_NE(snap_start_type, SSL_SNAP_START_NONE); |
| + if (snap_start_type == SSL_SNAP_START_RECOVERY || |
| + snap_start_type == SSL_SNAP_START_RESUME_RECOVERY) { |
| + // If we mispredicted the server's handshake then Snap Start will have |
| + // triggered a recovery mode. The misprediction could have been caused |
| + // by the server having a different certificate so the application data |
| + // wasn't resent. Now that we have verified the certificate, we need to |
| + // resend the application data. |
| + int bytes_written = DoPayloadWrite(); |
| + if (bytes_written != ERR_IO_PENDING) |
| + DoWriteCallback(bytes_written); |
| + } |
|
wtc
2010/11/02 22:29:17
IMPORTANT: I believe we need to add 'else' here, a
|
| + } |
| } |
| // Exit DoHandshakeLoop and return the result to the caller to Connect. |