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

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

Issue 655813003: Close SSLClientSocketOpenSSL cleanly if the transport was closed. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 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
« no previous file with comments | « no previous file | net/socket/ssl_client_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 // OpenSSL binding for SSLClientSocket. The class layout and general principle 5 // OpenSSL binding for SSLClientSocket. The class layout and general principle
6 // of operation is derived from SSLClientSocketNSS. 6 // of operation is derived from SSLClientSocketNSS.
7 7
8 #include "net/socket/ssl_client_socket_openssl.h" 8 #include "net/socket/ssl_client_socket_openssl.h"
9 9
10 #include <errno.h> 10 #include <errno.h>
(...skipping 1328 matching lines...) Expand 10 before | Expand all | Expand 10 after
1339 // Otherwise, an error occurred (rv <= 0). The error needs to be handled 1339 // Otherwise, an error occurred (rv <= 0). The error needs to be handled
1340 // immediately, while the OpenSSL errors are still available in 1340 // immediately, while the OpenSSL errors are still available in
1341 // thread-local storage. However, the handled/remapped error code should 1341 // thread-local storage. However, the handled/remapped error code should
1342 // only be returned if no application data was already read; if it was, the 1342 // only be returned if no application data was already read; if it was, the
1343 // error code should be deferred until the next call of DoPayloadRead. 1343 // error code should be deferred until the next call of DoPayloadRead.
1344 // 1344 //
1345 // If no data was read, |*next_result| will point to the return value of 1345 // If no data was read, |*next_result| will point to the return value of
1346 // this function. If at least some data was read, |*next_result| will point 1346 // this function. If at least some data was read, |*next_result| will point
1347 // to |pending_read_error_|, to be returned in a future call to 1347 // to |pending_read_error_|, to be returned in a future call to
1348 // DoPayloadRead() (e.g.: after the current data is handled). 1348 // DoPayloadRead() (e.g.: after the current data is handled).
1349 int *next_result = &rv; 1349 int *next_result = &rv;
davidben 2014/10/14 20:31:06 This logic (and similar logic in SSLClientSocketNS
1350 if (total_bytes_read > 0) { 1350 if (total_bytes_read > 0) {
1351 pending_read_error_ = rv; 1351 pending_read_error_ = rv;
1352 rv = total_bytes_read; 1352 rv = total_bytes_read;
1353 next_result = &pending_read_error_; 1353 next_result = &pending_read_error_;
1354 } 1354 }
1355 1355
1356 if (client_auth_cert_needed_) { 1356 if (client_auth_cert_needed_) {
1357 *next_result = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; 1357 *next_result = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1358 } else if (*next_result < 0) { 1358 } else if (*next_result < 0) {
1359 int err = SSL_get_error(ssl_, *next_result); 1359 int err = SSL_get_error(ssl_, *next_result);
1360 *next_result = MapOpenSSLError(err, err_tracer); 1360 *next_result = MapOpenSSLError(err, err_tracer);
1361
1362 // Servers do not reliably send close_notify, so
1363 // ERR_CONNECTION_CLOSED cannot be treated as fatal.
Ryan Sleevi 2014/10/17 20:53:00 This comment needs explaining (or my flu meds need
davidben 2014/10/20 17:13:24 Done.
1364 if (*next_result == ERR_CONNECTION_CLOSED)
1365 *next_result = 0;
1366
1361 if (rv > 0 && *next_result == ERR_IO_PENDING) { 1367 if (rv > 0 && *next_result == ERR_IO_PENDING) {
1362 // If at least some data was read from SSL_read(), do not treat 1368 // If at least some data was read from SSL_read(), do not treat
1363 // insufficient data as an error to return in the next call to 1369 // insufficient data as an error to return in the next call to
1364 // DoPayloadRead() - instead, let the call fall through to check 1370 // DoPayloadRead() - instead, let the call fall through to check
1365 // SSL_read() again. This is because DoTransportIO() may complete 1371 // SSL_read() again. This is because DoTransportIO() may complete
1366 // in between the next call to DoPayloadRead(), and thus it is 1372 // in between the next call to DoPayloadRead(), and thus it is
1367 // important to check SSL_read() on subsequent invocations to see 1373 // important to check SSL_read() on subsequent invocations to see
1368 // if a complete record may now be read. 1374 // if a complete record may now be read.
1369 *next_result = kNoPendingReadResult; 1375 *next_result = kNoPendingReadResult;
1370 } 1376 }
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1484 if (send_buffer_->BytesRemaining() <= 0) 1490 if (send_buffer_->BytesRemaining() <= 0)
1485 send_buffer_ = NULL; 1491 send_buffer_ = NULL;
1486 } 1492 }
1487 } 1493 }
1488 1494
1489 int SSLClientSocketOpenSSL::TransportReadComplete(int result) { 1495 int SSLClientSocketOpenSSL::TransportReadComplete(int result) {
1490 DCHECK(ERR_IO_PENDING != result); 1496 DCHECK(ERR_IO_PENDING != result);
1491 // If an EOF, canonicalize to ERR_CONNECTION_CLOSED here so MapOpenSSLError 1497 // If an EOF, canonicalize to ERR_CONNECTION_CLOSED here so MapOpenSSLError
1492 // does not report success. 1498 // does not report success.
1493 if (result == 0) 1499 if (result == 0)
1494 result = ERR_CONNECTION_CLOSED; 1500 result = ERR_CONNECTION_CLOSED;
davidben 2014/10/14 20:31:06 It is a little annoying that this fix is undoing t
Ryan Sleevi 2014/10/17 20:53:00 Sorry, I have trouble following you. It might be e
davidben 2014/10/20 17:13:24 I think I agree.
1495 if (result < 0) { 1501 if (result < 0) {
1496 DVLOG(1) << "TransportReadComplete result " << result; 1502 DVLOG(1) << "TransportReadComplete result " << result;
1497 // Received an error. Save it to be reported in a future read on 1503 // Received an error. Save it to be reported in a future read on
1498 // transport_bio_'s peer. 1504 // transport_bio_'s peer.
1499 transport_read_error_ = result; 1505 transport_read_error_ = result;
1500 } else { 1506 } else {
1501 DCHECK(recv_buffer_.get()); 1507 DCHECK(recv_buffer_.get());
1502 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result); 1508 int ret = BIO_write(transport_bio_, recv_buffer_->data(), result);
1503 // A write into a memory BIO should always succeed. 1509 // A write into a memory BIO should always succeed.
1504 DCHECK_EQ(result, ret); 1510 DCHECK_EQ(result, ret);
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
1766 ct::SCT_STATUS_LOG_UNKNOWN)); 1772 ct::SCT_STATUS_LOG_UNKNOWN));
1767 } 1773 }
1768 } 1774 }
1769 1775
1770 scoped_refptr<X509Certificate> 1776 scoped_refptr<X509Certificate>
1771 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { 1777 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const {
1772 return server_cert_; 1778 return server_cert_;
1773 } 1779 }
1774 1780
1775 } // namespace net 1781 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | net/socket/ssl_client_socket_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698