]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Allocate data buffer with mbuffer_st structure as suggested by Nikos.
authorJonathan Bastien-Filiatrault <joe@x2a.org>
Sat, 15 Aug 2009 18:32:38 +0000 (14:32 -0400)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 3 Jun 2010 17:38:33 +0000 (19:38 +0200)
lib/gnutls_buffers.c
lib/gnutls_buffers.h
lib/gnutls_mbuffers.c
lib/gnutls_record.c

index d64c1d955cbe15aa6aeb8ddb8bbfa77f34b64421..29121d2b01ac9b15ac340a6fd765494bb183e661 100644 (file)
@@ -666,22 +666,15 @@ _gnutls_io_read_buffered (gnutls_session_t session, opaque ** iptr,
  */
 ssize_t
 _gnutls_io_write_buffered (gnutls_session_t session,
-                          const gnutls_datum_t *msg)
+                          mbuffer_st *bufel)
 {
   mbuffer_head_st * const send_buffer = &session->internals.record_send_buffer;
-  int ret;
 
-  ret = _gnutls_mbuffer_enqueue (send_buffer, msg);
-  if (ret < 0)
-    {
-      gnutls_assert ();
-      gnutls_free (msg->data);
-      return ret;
-    }
+  _gnutls_mbuffer_enqueue_mbuffer (send_buffer, bufel);
 
   _gnutls_write_log
     ("WRITE: enqueued %d bytes for %p. Total %d bytes.\n",
-     (int)msg->size, session->internals.transport_recv_ptr,
+     (int)bufel->msg.size, session->internals.transport_recv_ptr,
      (int)send_buffer->byte_length);
 
   return _gnutls_io_write_flush (session);
index 4c5dae457276e34b7790a858959a64510997c5e8..2e0b7de7677dbed06d4074b0b6790ed8b78aff88 100644 (file)
@@ -37,7 +37,7 @@ void _gnutls_io_clear_read_buffer (gnutls_session_t);
 int _gnutls_io_clear_peeked_data (gnutls_session_t session);
 
 ssize_t _gnutls_io_write_buffered (gnutls_session_t session,
-                                  const gnutls_datum_t *msg);
+                                  mbuffer_st *bufel);
 
 int _gnutls_handshake_buffer_get_size (gnutls_session_t session);
 int _gnutls_handshake_buffer_put (gnutls_session_t session, opaque * data,
index 32980f0f09d02d904558247d89c603213deae961..4401304a6ef9027fe941bc78f20e7f4de41ab7f6 100644 (file)
@@ -45,7 +45,6 @@ _gnutls_mbuffer_clear (mbuffer_head_st *buf)
   for(bufel = buf->head; bufel != NULL; bufel = next)
     {
       next = bufel->next;
-      gnutls_free(bufel->msg.data);
       gnutls_free(bufel);
     }
 
@@ -135,7 +134,6 @@ remove_front (mbuffer_head_st *buf)
 
   buf->byte_length -= (bufel->msg.size - bufel->mark);
   buf->length -= 1;
-  gnutls_free(bufel->msg.data);
   gnutls_free(bufel);
 
   if (!buf->head)
index 20de1c41a3afefc5d9aef72cd8f591827b69f41f..ba4b88e5b1893c732ac1ef4582ece66a2d88852b 100644 (file)
@@ -32,6 +32,7 @@
 #include "gnutls_compress.h"
 #include "gnutls_cipher.h"
 #include "gnutls_buffers.h"
+#include "gnutls_mbuffers.h"
 #include "gnutls_handshake.h"
 #include "gnutls_hash_int.h"
 #include "gnutls_cipher_int.h"
@@ -336,7 +337,8 @@ _gnutls_send_int (gnutls_session_t session, content_type_t type,
                  gnutls_handshake_description_t htype, const void *_data,
                  size_t sizeofdata)
 {
-  gnutls_datum_t cipher;
+  mbuffer_st *bufel;
+  size_t cipher_size;
   int retval, ret;
   int data2send_size;
   uint8_t headers[5];
@@ -386,11 +388,9 @@ _gnutls_send_int (gnutls_session_t session, content_type_t type,
     {
       ret = _gnutls_io_write_flush (session);
       if (ret > 0)
-       cipher.size = ret;
+       cipher_size = ret;
       else
-       cipher.size = 0;
-
-      cipher.data = NULL;
+       cipher_size = 0;
 
       retval = session->internals.record_send_buffer.byte_length;
     }
@@ -399,26 +399,26 @@ _gnutls_send_int (gnutls_session_t session, content_type_t type,
 
       /* now proceed to packet encryption
        */
-      cipher.size = data2send_size + MAX_RECORD_OVERHEAD;
-      cipher.data = gnutls_malloc (cipher.size);
-      if (cipher.data == NULL)
+      cipher_size = data2send_size + MAX_RECORD_OVERHEAD;
+      bufel = _gnutls_mbuffer_alloc (cipher_size);
+      if (bufel == NULL)
        {
          gnutls_assert ();
          return GNUTLS_E_MEMORY_ERROR;
        }
 
-      cipher.size =
+      cipher_size =
        _gnutls_encrypt (session, headers, RECORD_HEADER_SIZE, data,
-                        data2send_size, cipher.data, cipher.size, type,
+                        data2send_size, bufel->msg.data, cipher_size, type,
                         (session->internals.priorities.no_padding ==
                          0) ? 1 : 0);
-      if (cipher.size <= 0)
+      if (cipher_size <= 0)
        {
          gnutls_assert ();
-         if (cipher.size == 0)
-           cipher.size = GNUTLS_E_ENCRYPTION_FAILED;
-         gnutls_free (cipher.data);
-         return cipher.size;   /* error */
+         if (cipher_size == 0)
+           cipher_size = GNUTLS_E_ENCRYPTION_FAILED;
+         gnutls_free (bufel);
+         return cipher_size;   /* error */
        }
 
       retval = data2send_size;
@@ -430,14 +430,15 @@ _gnutls_send_int (gnutls_session_t session, content_type_t type,
        {
          session_invalidate (session);
          gnutls_assert ();
-         gnutls_free (cipher.data);
+         gnutls_free (bufel);
          return GNUTLS_E_RECORD_LIMIT_REACHED;
        }
 
-      ret = _gnutls_io_write_buffered (session, &cipher);
+      bufel->msg.size = cipher_size;
+      ret = _gnutls_io_write_buffered (session, bufel);
     }
 
-  if (ret != cipher.size)
+  if (ret != cipher_size)
     {
       if (ret < 0 && gnutls_error_is_fatal (ret) == 0)
        {
@@ -464,7 +465,7 @@ _gnutls_send_int (gnutls_session_t session, content_type_t type,
                      (int)
                      _gnutls_uint64touint32
                      (&session->connection_state.write_sequence_number),
-                     _gnutls_packet2str (type), type, cipher.size);
+                     _gnutls_packet2str (type), type, cipher_size);
 
   return retval;
 }