OLD | NEW |
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 1464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1475 // DoPayloadRead() (e.g.: after the current data is handled). | 1475 // DoPayloadRead() (e.g.: after the current data is handled). |
1476 int *next_result = &rv; | 1476 int *next_result = &rv; |
1477 if (total_bytes_read > 0) { | 1477 if (total_bytes_read > 0) { |
1478 pending_read_error_ = rv; | 1478 pending_read_error_ = rv; |
1479 rv = total_bytes_read; | 1479 rv = total_bytes_read; |
1480 next_result = &pending_read_error_; | 1480 next_result = &pending_read_error_; |
1481 } | 1481 } |
1482 | 1482 |
1483 if (client_auth_cert_needed_) { | 1483 if (client_auth_cert_needed_) { |
1484 *next_result = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; | 1484 *next_result = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; |
1485 } else if (*next_result < 0) { | 1485 } else if (*next_result <= 0) { |
| 1486 // A zero return from SSL_read may mean any of: |
| 1487 // - The underlying BIO_read returned 0. |
| 1488 // - The peer sent a close_notify. |
| 1489 // - Any arbitrary error. https://crbug.com/466303 |
| 1490 // |
| 1491 // TransportReadComplete converts the first to an ERR_CONNECTION_CLOSED |
| 1492 // error, so it does not occur. The second and third are distinguished by |
| 1493 // SSL_ERROR_ZERO_RETURN. |
1486 pending_read_ssl_error_ = SSL_get_error(ssl_, *next_result); | 1494 pending_read_ssl_error_ = SSL_get_error(ssl_, *next_result); |
1487 *next_result = MapOpenSSLErrorWithDetails(pending_read_ssl_error_, | 1495 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) { |
1488 err_tracer, | 1496 *next_result = 0; |
1489 &pending_read_error_info_); | 1497 } else { |
| 1498 *next_result = MapOpenSSLErrorWithDetails( |
| 1499 pending_read_ssl_error_, err_tracer, &pending_read_error_info_); |
| 1500 } |
1490 | 1501 |
1491 // Many servers do not reliably send a close_notify alert when shutting | 1502 // Many servers do not reliably send a close_notify alert when shutting |
1492 // down a connection, and instead terminate the TCP connection. This is | 1503 // down a connection, and instead terminate the TCP connection. This is |
1493 // reported as ERR_CONNECTION_CLOSED. Because of this, map the unclean | 1504 // reported as ERR_CONNECTION_CLOSED. Because of this, map the unclean |
1494 // shutdown to a graceful EOF, instead of treating it as an error as it | 1505 // shutdown to a graceful EOF, instead of treating it as an error as it |
1495 // should be. | 1506 // should be. |
1496 if (*next_result == ERR_CONNECTION_CLOSED) | 1507 if (*next_result == ERR_CONNECTION_CLOSED) |
1497 *next_result = 0; | 1508 *next_result = 0; |
1498 | 1509 |
1499 if (rv > 0 && *next_result == ERR_IO_PENDING) { | 1510 if (rv > 0 && *next_result == ERR_IO_PENDING) { |
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1960 | 1971 |
1961 return result; | 1972 return result; |
1962 } | 1973 } |
1963 | 1974 |
1964 scoped_refptr<X509Certificate> | 1975 scoped_refptr<X509Certificate> |
1965 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { | 1976 SSLClientSocketOpenSSL::GetUnverifiedServerCertificateChain() const { |
1966 return server_cert_; | 1977 return server_cert_; |
1967 } | 1978 } |
1968 | 1979 |
1969 } // namespace net | 1980 } // namespace net |
OLD | NEW |