]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
removed large buffer
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Sun, 28 Jan 2001 23:35:55 +0000 (23:35 +0000)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Sun, 28 Jan 2001 23:35:55 +0000 (23:35 +0000)
lib/gnutls.c
lib/gnutls_cipher.c
lib/gnutls_cipher.h

index 2c7b394fdffff3ed2bc0458522deb8386bc510e7..51ef518bb1f137b76b43607ed78e687a01e3e2a7 100644 (file)
@@ -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;
 }
 
index 52a0460ce0f9d72103ab86f1f374b608eebe2b9d..30f9d628ffe30611840f1089808f74f2a49485fe 100644 (file)
@@ -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);
index daf0563804863c17d80321468415417f95d68438..dc0ed1d44518bf532e5c7691458c3411701f83b2 100644 (file)
@@ -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);