From e604888ff774747d2d6d68fa13f129f8e88679d3 Mon Sep 17 00:00:00 2001 From: Ossama Othman Date: Wed, 16 Apr 2003 07:16:40 +0000 Subject: ChangeLogTag:Wed Apr 16 00:10:37 2003 Ossama Othman --- ace/SSL/SSL_Asynch_Stream.cpp | 12 +++---- ace/SSL/SSL_SOCK_Stream.cpp | 81 +++++++++++++++++++++++++++---------------- ace/SSL/SSL_SOCK_Stream.i | 10 +++--- 3 files changed, 63 insertions(+), 40 deletions(-) (limited to 'ace/SSL') diff --git a/ace/SSL/SSL_Asynch_Stream.cpp b/ace/SSL/SSL_Asynch_Stream.cpp index 160b86a466b..8978452dc7c 100644 --- a/ace/SSL/SSL_Asynch_Stream.cpp +++ b/ace/SSL/SSL_Asynch_Stream.cpp @@ -638,9 +638,9 @@ ACE_SSL_Asynch_Stream::do_SSL_read (void) ACE_Message_Block & mb = this->ext_read_result_->message_block (); size_t bytes_req = this->ext_read_result_->bytes_to_read (); - int bytes_trn = ::SSL_read (this->ssl_, - mb.rd_ptr (), - bytes_req); + const int bytes_trn = ::SSL_read (this->ssl_, + mb.wr_ptr (), + bytes_req); int status = ::SSL_get_error (this->ssl_, bytes_trn); @@ -695,9 +695,9 @@ ACE_SSL_Asynch_Stream::do_SSL_write (void) ACE_Message_Block & mb = this->ext_write_result_->message_block (); size_t bytes_req = this->ext_write_result_->bytes_to_write (); - int bytes_trn = ::SSL_write (this->ssl_, - mb.rd_ptr (), - bytes_req); + const int bytes_trn = ::SSL_write (this->ssl_, + mb.rd_ptr (), + bytes_req); int status = ::SSL_get_error (this->ssl_, bytes_trn); diff --git a/ace/SSL/SSL_SOCK_Stream.cpp b/ace/SSL/SSL_SOCK_Stream.cpp index 578051416d9..f7189463360 100644 --- a/ace/SSL/SSL_SOCK_Stream.cpp +++ b/ace/SSL/SSL_SOCK_Stream.cpp @@ -89,9 +89,9 @@ ACE_SSL_SOCK_Stream::sendv (const iovec iov[], for (size_t i = 0; i < n; ++i) { - ssize_t result = this->send (iov[i].iov_base, - iov[i].iov_len, - timeout); + const ssize_t result = this->send (iov[i].iov_base, + iov[i].iov_len, + timeout); if (result == -1) { @@ -99,7 +99,6 @@ ACE_SSL_SOCK_Stream::sendv (const iovec iov[], // whether or not any data was sent. If no data was sent, // then always return -1. Otherwise return bytes_sent. // This gives the caller an opportunity to keep track of - // which data was actually sent. if (bytes_sent > 0) break; else @@ -224,7 +223,7 @@ ACE_SSL_SOCK_Stream::send (size_t n, ...) const { ACE_TRACE ("ACE_SSL_SOCK_Stream::send"); - size_t total_tuples = n / 2; + const size_t total_tuples = n / 2; va_list argp; va_start (argp, n); @@ -238,8 +237,9 @@ ACE_SSL_SOCK_Stream::send (size_t n, ...) const // scatter writes over SSL. for (size_t i = 0; i < total_tuples; ++i) { - ssize_t result = this->send (va_arg (argp, char *), - va_arg (argp, ssize_t)); + const ssize_t data_len = va_arg (argp, ssize_t); + const ssize_t result = this->send (va_arg (argp, char *), + data_len); if (result == -1) { @@ -257,7 +257,18 @@ ACE_SSL_SOCK_Stream::send (size_t n, ...) const } } else - bytes_sent += result; + { + bytes_sent += result; + + // Do not continue on to the next loop iteration if the + // amount of data sent was less than the amount of data + // given. This avoids a subtle problem where "holes" in the + // data stream would occur if partial sends of a given + // buffer in the varargs occured. + if (result < data_len) + break; + + } } va_end (argp); @@ -270,7 +281,7 @@ ACE_SSL_SOCK_Stream::recv (size_t n, ...) const { ACE_TRACE ("ACE_SSL_SOCK_Stream::recv"); - size_t total_tuples = n / 2; + const size_t total_tuples = n / 2; va_list argp; va_start (argp, n); @@ -279,8 +290,9 @@ ACE_SSL_SOCK_Stream::recv (size_t n, ...) const for (size_t i = 0; i < total_tuples; ++i) { - ssize_t result = this->recv (va_arg (argp, char *), - va_arg (argp, ssize_t)); + const ssize_t data_len = va_arg (argp, ssize_t); + const ssize_t result = this->recv (va_arg (argp, char *), + data_len); if (result == -1) { @@ -298,7 +310,18 @@ ACE_SSL_SOCK_Stream::recv (size_t n, ...) const } } else - bytes_recv += result; + { + bytes_recv += result; + + // Do not continue on to the next loop iteration if the + // amount of data received was less than the amount of data + // desired. This avoids a subtle problem where "holes" in + // the data stream would occur if partial receives of a + // given buffer in the varargs occured. + if (result < data_len) + break; + + } } va_end (argp); @@ -337,16 +360,16 @@ ACE_SSL_SOCK_Stream::send_n (const void *buf, timeout); if (n < 0) - { + { if (errno == EWOULDBLOCK) { // If blocked, try again. - n = 0; - continue; + n = 0; + continue; } else return -1; - } + } else if (n == 0) break; } @@ -384,16 +407,16 @@ ACE_SSL_SOCK_Stream::recv_n (void *buf, timeout); if (n < 0) - { + { if (errno == EWOULDBLOCK) { // If blocked, try again. - n = 0; - continue; + n = 0; + continue; } else return -1; - } + } else if (n == 0) break; } @@ -424,18 +447,18 @@ ACE_SSL_SOCK_Stream::recv_n (void *buf, int len, int flags) const flags); if (n < 0) - { + { if (errno == EWOULDBLOCK) { // If blocked, try again. - n = 0; - continue; + n = 0; + continue; } else return -1; - } + } else if (n == 0) - break; + break; } return bytes_transferred; @@ -463,16 +486,16 @@ ACE_SSL_SOCK_Stream::send_n (const void *buf, int len, int flags) const flags); if (n < 0) - { + { if (errno == EWOULDBLOCK) { // If blocked, try again. - n = 0; - continue; + n = 0; + continue; } else return -1; - } + } else if (n == 0) break; } diff --git a/ace/SSL/SSL_SOCK_Stream.i b/ace/SSL/SSL_SOCK_Stream.i index 4cbd184837a..ea345cbe921 100644 --- a/ace/SSL/SSL_SOCK_Stream.i +++ b/ace/SSL/SSL_SOCK_Stream.i @@ -31,9 +31,9 @@ ACE_SSL_SOCK_Stream::send_i (const void *buf, if (flags != 0) ACE_NOTSUP_RETURN (-1); - int bytes_sent = ::SSL_write (this->ssl_, - ACE_static_cast (const char *, buf), - n); + const int bytes_sent = ::SSL_write (this->ssl_, + ACE_static_cast (const char *, buf), + n); switch (::SSL_get_error (this->ssl_, bytes_sent)) { @@ -137,7 +137,7 @@ ACE_SSL_SOCK_Stream::recv_i (void *buf, n); } - int status = ::SSL_get_error (this->ssl_, bytes_read); + const int status = ::SSL_get_error (this->ssl_, bytes_read); switch (status) { case SSL_ERROR_NONE: @@ -271,7 +271,7 @@ ACE_SSL_SOCK_Stream::close (void) // SSL_shutdown() returns 1 on successful shutdown of the SSL // connection, not 0. - int status = ::SSL_shutdown (this->ssl_); + const int status = ::SSL_shutdown (this->ssl_); switch (::SSL_get_error (this->ssl_, status)) { -- cgit v1.2.1