From: Nikos Mavrogiannopoulos Date: Sun, 28 Jan 2001 23:35:55 +0000 (+0000) Subject: removed large buffer X-Git-Tag: gnutls-0-1-0-srp~55 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7900fcaeff25328989cc3a94d75094da2dfb0ca5;p=thirdparty%2Fgnutls.git removed large buffer --- diff --git a/lib/gnutls.c b/lib/gnutls.c index 2c7b394fdf..51ef518bb1 100644 --- a/lib/gnutls.c +++ b/lib/gnutls.c @@ -409,12 +409,13 @@ int gnutls_close_nowait(int cd, GNUTLS_STATE state) */ ssize_t gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, void *_data, size_t sizeofdata, int flags) { - uint8 cipher[MAX_ENC_LEN+HEADER_SIZE]; + uint8 *cipher; int i, cipher_size; int ret = 0; int iterations; uint16 length; int Size; + uint8 headers[5]; uint8 *data=_data; if (sizeofdata == 0) @@ -431,20 +432,25 @@ ssize_t gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, void *_dat Size = MAX_ENC_LEN; } - cipher[0]=type; - cipher[1]=state->connection_state.version.major; - cipher[2]=state->connection_state.version.minor; + headers[0]=type; + headers[1]=state->connection_state.version.major; + headers[2]=state->connection_state.version.minor; for (i = 0; i < iterations; i++) { - cipher_size = _gnutls_encrypt( state, &data[i*Size], Size, &cipher[5], type); + cipher_size = _gnutls_encrypt( state, &data[i*Size], Size, &cipher, type); if (cipher_size<=0) return cipher_size; #ifdef WORDS_BIGENDIAN length = cipher_size; #else length = byteswap16(cipher_size); #endif - memmove( &cipher[3], &length, sizeof(uint16)); - cipher_size += HEADER_SIZE; /* add headers */ + memmove( &headers[3], &length, sizeof(uint16)); + if (_gnutls_Write(cd, headers, sizeof(headers)) != sizeof(headers)) { + state->gnutls_internals.valid_connection = VALID_FALSE; + state->gnutls_internals.resumable = RESUME_FALSE; + gnutls_assert(); + return GNUTLS_E_UNABLE_SEND_DATA; + } if (_gnutls_Write(cd, cipher, cipher_size) != cipher_size) { state->gnutls_internals.valid_connection = VALID_FALSE; state->gnutls_internals.resumable = RESUME_FALSE; @@ -456,15 +462,20 @@ ssize_t gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, void *_dat /* rest data */ if (iterations > 1) { Size = sizeofdata % MAX_ENC_LEN; - cipher_size = _gnutls_encrypt( state, &data[i*Size], Size, &cipher[5], type); + cipher_size = _gnutls_encrypt( state, &data[i*Size], Size, &cipher, type); if (cipher_size<=0) return cipher_size; #ifdef WORDS_BIGENDIAN length = cipher_size; #else length = byteswap16(cipher_size); #endif - memmove( &cipher[3], &length, sizeof(uint16)); - cipher_size+=HEADER_SIZE; /* add headers */ + memmove( &headers[3], &length, sizeof(uint16)); + if (_gnutls_Write(cd, headers, sizeof(headers)) != sizeof(headers)) { + state->gnutls_internals.valid_connection = VALID_FALSE; + state->gnutls_internals.resumable = RESUME_FALSE; + gnutls_assert(); + return GNUTLS_E_UNABLE_SEND_DATA; + } if (_gnutls_Write(cd, cipher, cipher_size) != cipher_size) { state->gnutls_internals.valid_connection = VALID_FALSE; state->gnutls_internals.resumable = RESUME_FALSE; @@ -476,6 +487,8 @@ ssize_t gnutls_send_int(int cd, GNUTLS_STATE state, ContentType type, void *_dat ret += sizeofdata; + gnutls_free(cipher); + return ret; } diff --git a/lib/gnutls_cipher.c b/lib/gnutls_cipher.c index 52a0460ce0..30f9d628ff 100644 --- a/lib/gnutls_cipher.c +++ b/lib/gnutls_cipher.c @@ -30,7 +30,7 @@ #include "debug.h" int _gnutls_encrypt(GNUTLS_STATE state, char *data, size_t data_size, - uint8 * ciphertext, ContentType type) + uint8 ** ciphertext, ContentType type) { GNUTLSPlaintext *gtxt; GNUTLSCompressed *gcomp; @@ -63,17 +63,13 @@ int _gnutls_encrypt(GNUTLS_STATE state, char *data, size_t data_size, _gnutls_freeTLSCompressed(gcomp); - if (ciphertext == NULL) { + *ciphertext = gnutls_malloc(gcipher->length); + if (*ciphertext == NULL) { gnutls_assert(); return GNUTLS_E_MEMORY_ERROR; } - if (gcipher->length < MAX_ENC_LEN) - memmove(ciphertext, gcipher->fragment, gcipher->length); - else { - /* that shouldn't happen! */ - gnutls_assert(); - return GNUTLS_E_UNEXPECTED_PACKET_LENGTH; - } + memmove((*ciphertext), gcipher->fragment, gcipher->length); + total_length += gcipher->length; _gnutls_freeTLSCiphertext(gcipher); diff --git a/lib/gnutls_cipher.h b/lib/gnutls_cipher.h index daf0563804..dc0ed1d445 100644 --- a/lib/gnutls_cipher.h +++ b/lib/gnutls_cipher.h @@ -1,4 +1,4 @@ -int _gnutls_encrypt( GNUTLS_STATE state, char* data, size_t data_size, uint8* ciphertext, ContentType type); +int _gnutls_encrypt( GNUTLS_STATE state, char* data, size_t data_size, uint8** ciphertext, ContentType type); int _gnutls_decrypt(GNUTLS_STATE state, char *ciphertext, size_t ciphertext_size, uint8 ** data, ContentType type);