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

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

Issue 12025040: When reading from an SSL socket, attempt to fully fill the caller's buffer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Initialization order Created 7 years, 10 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 | Annotate | Revision Log
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 <openssl/ssl.h> 10 #include <openssl/ssl.h>
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 } 418 }
419 419
420 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL( 420 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
421 ClientSocketHandle* transport_socket, 421 ClientSocketHandle* transport_socket,
422 const HostPortPair& host_and_port, 422 const HostPortPair& host_and_port,
423 const SSLConfig& ssl_config, 423 const SSLConfig& ssl_config,
424 const SSLClientSocketContext& context) 424 const SSLClientSocketContext& context)
425 : transport_send_busy_(false), 425 : transport_send_busy_(false),
426 transport_recv_busy_(false), 426 transport_recv_busy_(false),
427 transport_recv_eof_(false), 427 transport_recv_eof_(false),
428 pending_read_error_(1),
428 completed_handshake_(false), 429 completed_handshake_(false),
429 client_auth_cert_needed_(false), 430 client_auth_cert_needed_(false),
430 cert_verifier_(context.cert_verifier), 431 cert_verifier_(context.cert_verifier),
431 ssl_(NULL), 432 ssl_(NULL),
432 transport_bio_(NULL), 433 transport_bio_(NULL),
433 transport_(transport_socket), 434 transport_(transport_socket),
434 host_and_port_(host_and_port), 435 host_and_port_(host_and_port),
435 ssl_config_(ssl_config), 436 ssl_config_(ssl_config),
436 ssl_session_cache_shard_(context.ssl_session_cache_shard), 437 ssl_session_cache_shard_(context.ssl_session_cache_shard),
437 trying_cached_session_(false), 438 trying_cached_session_(false),
(...skipping 895 matching lines...) Expand 10 before | Expand all | Expand 10 after
1333 bool SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) { 1334 bool SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) {
1334 return transport_->socket()->SetReceiveBufferSize(size); 1335 return transport_->socket()->SetReceiveBufferSize(size);
1335 } 1336 }
1336 1337
1337 bool SSLClientSocketOpenSSL::SetSendBufferSize(int32 size) { 1338 bool SSLClientSocketOpenSSL::SetSendBufferSize(int32 size) {
1338 return transport_->socket()->SetSendBufferSize(size); 1339 return transport_->socket()->SetSendBufferSize(size);
1339 } 1340 }
1340 1341
1341 int SSLClientSocketOpenSSL::DoPayloadRead() { 1342 int SSLClientSocketOpenSSL::DoPayloadRead() {
1342 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); 1343 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1343 int rv = SSL_read(ssl_, user_read_buf_->data(), user_read_buf_len_); 1344
1344 // We don't need to invalidate the non-client-authenticated SSL session 1345 int rv;
1345 // because the server will renegotiate anyway. 1346 if (pending_read_error_ <= 0) {
1346 if (client_auth_cert_needed_) 1347 rv = pending_read_error_;
1347 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED; 1348 pending_read_error_ = 1;
wtc 2013/02/13 22:06:51 If rv == 0, we need to log a NetLog::TYPE_SSL_SOCK
1349 return rv;
1350 }
1351
1352 int total_bytes_read = 0;
1353 do {
1354 rv = SSL_read(ssl_, user_read_buf_->data() + total_bytes_read,
1355 user_read_buf_len_ - total_bytes_read);
1356 if (rv > 0)
1357 total_bytes_read += rv;
1358 } while (total_bytes_read < user_read_buf_len_ && rv > 0);
1359
1360 if (total_bytes_read == user_read_buf_len_) {
1361 rv = total_bytes_read;
1362 } else {
1363 int *next_result = &rv;
1364 if (total_bytes_read > 0) {
1365 pending_read_error_ = rv;
Ryan Hamilton 2013/02/13 17:23:18 It looks like this is the only place you assign a
Ryan Sleevi 2013/02/13 20:44:43 Actually, this is a "failure" value (it can only b
Ryan Hamilton 2013/02/13 21:50:34 As part of this CL, or in a different one?
1366 rv = total_bytes_read;
1367 next_result = &pending_read_error_;
1368 }
1369 if (client_auth_cert_needed_) {
1370 *next_result = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1371 } else if (*next_result < 0) {
1372 int err = SSL_get_error(ssl_, *next_result);
1373 *next_result = MapOpenSSLError(err, err_tracer);
1374 }
1375 }
1348 1376
1349 if (rv >= 0) { 1377 if (rv >= 0) {
1350 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv, 1378 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv,
1351 user_read_buf_->data()); 1379 user_read_buf_->data());
1352 return rv;
1353 } 1380 }
1354 1381 return rv;
1355 int err = SSL_get_error(ssl_, rv);
1356 return MapOpenSSLError(err, err_tracer);
1357 } 1382 }
1358 1383
1359 int SSLClientSocketOpenSSL::DoPayloadWrite() { 1384 int SSLClientSocketOpenSSL::DoPayloadWrite() {
1360 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); 1385 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1361 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_); 1386 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_);
1362 1387
1363 if (rv >= 0) { 1388 if (rv >= 0) {
1364 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, 1389 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv,
1365 user_write_buf_->data()); 1390 user_write_buf_->data());
1366 return rv; 1391 return rv;
1367 } 1392 }
1368 1393
1369 int err = SSL_get_error(ssl_, rv); 1394 int err = SSL_get_error(ssl_, rv);
1370 return MapOpenSSLError(err, err_tracer); 1395 return MapOpenSSLError(err, err_tracer);
1371 } 1396 }
1372 1397
1373 } // namespace net 1398 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698