X-Git-Url: https://git.openssl.org/gitweb/?a=blobdiff_plain;f=ssl%2Frecord%2Fssl3_buffer.c;h=53ae0f490d80b72fb2a19bae24708e9bc1062824;hb=5951e840d9295bed554c267f51d7977b8f76b4bb;hp=9afd747e51b354010fc3ef72545c5ccaa420903e;hpb=7a7048aff053929feaadee4895749fe0a661d353;p=openssl.git diff --git a/ssl/record/ssl3_buffer.c b/ssl/record/ssl3_buffer.c index 9afd747e51..53ae0f490d 100644 --- a/ssl/record/ssl3_buffer.c +++ b/ssl/record/ssl3_buffer.c @@ -1,4 +1,3 @@ -/* ssl/record/ssl3_buffer.c */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -110,19 +109,29 @@ */ #include "../ssl_locl.h" +#include "record_locl.h" void SSL3_BUFFER_set_data(SSL3_BUFFER *b, const unsigned char *d, int n) { - if(d != NULL) + if (d != NULL) memcpy(b->buf, d, n); b->left = n; b->offset = 0; } +/* + * Clear the contents of an SSL3_BUFFER but retain any memory allocated. Also + * retains the default_len setting + */ +void SSL3_BUFFER_clear(SSL3_BUFFER *b) +{ + b->offset = 0; + b->left = 0; +} + void SSL3_BUFFER_release(SSL3_BUFFER *b) { - if (b->buf != NULL) - OPENSSL_free(b->buf); + OPENSSL_free(b->buf); b->buf = NULL; } @@ -134,7 +143,7 @@ int ssl3_setup_read_buffer(SSL *s) b = RECORD_LAYER_get_rbuf(&s->rlayer); - if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER) + if (SSL_IS_DTLS(s)) headerlen = DTLS1_RT_HEADER_LENGTH; else headerlen = SSL3_RT_HEADER_LENGTH; @@ -146,14 +155,12 @@ int ssl3_setup_read_buffer(SSL *s) if (b->buf == NULL) { len = SSL3_RT_MAX_PLAIN_LENGTH + SSL3_RT_MAX_ENCRYPTED_OVERHEAD + headerlen + align; - if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER) { - s->s3->init_extra = 1; - len += SSL3_RT_MAX_EXTRA; - } #ifndef OPENSSL_NO_COMP if (ssl_allow_compression(s)) len += SSL3_RT_MAX_COMPRESSED_OVERHEAD; #endif + if (b->default_len > len) + len = b->default_len; if ((p = OPENSSL_malloc(len)) == NULL) goto err; b->buf = p; @@ -168,15 +175,17 @@ int ssl3_setup_read_buffer(SSL *s) return 0; } -int ssl3_setup_write_buffer(SSL *s) +int ssl3_setup_write_buffer(SSL *s, unsigned int numwpipes) { unsigned char *p; size_t len, align = 0, headerlen; SSL3_BUFFER *wb; + unsigned int currpipe; - wb = RECORD_LAYER_get_wbuf(&s->rlayer); + s->rlayer.numwpipes = numwpipes; - if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER) + + if (SSL_IS_DTLS(s)) headerlen = DTLS1_RT_HEADER_LENGTH + 1; else headerlen = SSL3_RT_HEADER_LENGTH; @@ -185,20 +194,25 @@ int ssl3_setup_write_buffer(SSL *s) align = (-SSL3_RT_HEADER_LENGTH) & (SSL3_ALIGN_PAYLOAD - 1); #endif - if (wb->buf == NULL) { - len = s->max_send_fragment - + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD + headerlen + align; + len = s->max_send_fragment + + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD + headerlen + align; #ifndef OPENSSL_NO_COMP - if (ssl_allow_compression(s)) - len += SSL3_RT_MAX_COMPRESSED_OVERHEAD; + if (ssl_allow_compression(s)) + len += SSL3_RT_MAX_COMPRESSED_OVERHEAD; #endif - if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)) - len += headerlen + align + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD; + if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)) + len += headerlen + align + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD; - if ((p = OPENSSL_malloc(len)) == NULL) - goto err; - wb->buf = p; - wb->len = len; + wb = RECORD_LAYER_get_wbuf(&s->rlayer); + for (currpipe = 0; currpipe < numwpipes; currpipe++) { + if (wb[currpipe].buf == NULL) { + if ((p = OPENSSL_malloc(len)) == NULL) { + s->rlayer.numwpipes = currpipe; + goto err; + } + wb[currpipe].buf = p; + wb[currpipe].len = len; + } } return 1; @@ -212,7 +226,7 @@ int ssl3_setup_buffers(SSL *s) { if (!ssl3_setup_read_buffer(s)) return 0; - if (!ssl3_setup_write_buffer(s)) + if (!ssl3_setup_write_buffer(s, 1)) return 0; return 1; } @@ -220,13 +234,17 @@ int ssl3_setup_buffers(SSL *s) int ssl3_release_write_buffer(SSL *s) { SSL3_BUFFER *wb; + unsigned int pipes; - wb = RECORD_LAYER_get_wbuf(&s->rlayer); + pipes = s->rlayer.numwpipes; + while (pipes > 0) { + wb = &RECORD_LAYER_get_wbuf(&s->rlayer)[pipes - 1]; - if (wb->buf != NULL) { OPENSSL_free(wb->buf); wb->buf = NULL; + pipes--; } + s->rlayer.numwpipes = 0; return 1; } @@ -235,9 +253,7 @@ int ssl3_release_read_buffer(SSL *s) SSL3_BUFFER *b; b = RECORD_LAYER_get_rbuf(&s->rlayer); - if (b->buf != NULL) { - OPENSSL_free(b->buf); - b->buf = NULL; - } + OPENSSL_free(b->buf); + b->buf = NULL; return 1; }