]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Some other changes to mbuffers to make gnutls (a bit more) agnostic on their internal...
authorNikos Mavrogiannopoulos <nmav@gnutls.org>
Wed, 2 Jun 2010 22:59:39 +0000 (00:59 +0200)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Thu, 3 Jun 2010 17:55:43 +0000 (19:55 +0200)
lib/gnutls_handshake.c
lib/gnutls_mbuffers.h
lib/gnutls_record.c

index cddeef7f0d1aba5ea6345cc0f160387f7c4b2165..e03280cc3498fb82841ec20bed3670bdc3bfb281 100644 (file)
@@ -674,7 +674,7 @@ _gnutls_send_finished (gnutls_session_t session, int again)
 
   if (again == 0)
     {
-      bufel = _gnutls_handshake_alloc (36);
+      bufel = _gnutls_handshake_alloc (MAX_VERIFY_DATA_SIZE);
       if (bufel == NULL)
        {
          gnutls_assert ();
@@ -1156,8 +1156,8 @@ _gnutls_send_handshake (gnutls_session_t session, mbuffer_st *bufel,
     }
 
   /* first run */
-  data = bufel->msg.data;
-  datasize = bufel->msg.size;
+  data = _mbuffer_get_uhead_ptr(bufel);
+  datasize = _mbuffer_get_udata_size(bufel) + _mbuffer_get_uhead_size(bufel);
 
   data[pos++] = (uint8_t) type;
   _gnutls_write_uint24 (bufel->msg.size - bufel->mark, &data[pos]);
index 6c6fb9d29ce22ae541a03d6da57ebab24987e545..a1a6065328e23da9bcc617841b6b5e02c6411f76 100644 (file)
 
 #include "gnutls_int.h"
 
-void _gnutls_mbuffer_init (mbuffer_head_st *buf);
-void _gnutls_mbuffer_clear (mbuffer_head_st *buf);
-void _gnutls_mbuffer_enqueue (mbuffer_head_st *buf, mbuffer_st *bufel);
-void _gnutls_mbuffer_get_head (mbuffer_head_st *buf, gnutls_datum_t *msg);
-int  _gnutls_mbuffer_remove_bytes (mbuffer_head_st *buf, size_t bytes);
-mbuffer_st* _gnutls_mbuffer_alloc (size_t payload_size);
-mbuffer_st* _gnutls_mbuffer_realloc (mbuffer_st *bufel, size_t payload_size);
+void _mbuffer_init (mbuffer_head_st *buf);
+void _mbuffer_clear (mbuffer_head_st *buf);
+void _mbuffer_enqueue (mbuffer_head_st *buf, mbuffer_st *bufel);
+void _mbuffer_get_head (mbuffer_head_st *buf, gnutls_datum_t *msg);
+int  _mbuffer_remove_bytes (mbuffer_head_st *buf, size_t bytes);
+mbuffer_st* _mbuffer_alloc (size_t payload_size);
+
+/* This is dangerous since it will replace bufel with a new
+ * one.
+ */
+mbuffer_st* _mbuffer_append_data (mbuffer_st *bufel, void* newdata, size_t newdata_size);
+
+
+/* For "user" use. One can have buffer data and header.
+ */
+
+inline static void _mbuffer_set_udata(mbuffer_st *bufel, void* data, size_t data_size)
+{
+  memcpy(bufel->msg.data + bufel->user_mark, data, data_size);
+}
+
+inline static void* _mbuffer_get_uhead_ptr(mbuffer_st *bufel)
+{
+  return bufel->msg.data;
+}
+
+inline static void* _mbuffer_get_udata_ptr(mbuffer_st *bufel)
+{
+  return bufel->msg.data + bufel->user_mark;
+}
+
+inline static void _mbuffer_set_udata_size(mbuffer_st *bufel, size_t size)
+{
+  bufel->msg.size = size + bufel->user_mark;
+}
+
+inline static size_t _mbuffer_get_udata_size(mbuffer_st *bufel)
+{
+  return bufel->msg.size - bufel->user_mark;
+}
+
+inline static size_t _mbuffer_get_uhead_size(mbuffer_st *bufel)
+{
+  return bufel->user_mark;
+}
+
+inline static void _mbuffer_set_uhead_size(mbuffer_st *bufel, size_t size)
+{
+  bufel->user_mark = size;
+}
+
+
+
+inline static mbuffer_st* _gnutls_handshake_alloc(size_t size)
+{
+  mbuffer_st *ret = _mbuffer_alloc (HANDSHAKE_HEADER_SIZE + size);
+
+  if (!ret)
+    return NULL;
+
+  _mbuffer_set_uhead_size(ret, HANDSHAKE_HEADER_SIZE);
+
+  return ret;
+}
 
 #endif
index ba4b88e5b1893c732ac1ef4582ece66a2d88852b..1209e0d4b85d6527e950ec36b37569c37c2eb1ba 100644 (file)
@@ -409,7 +409,7 @@ _gnutls_send_int (gnutls_session_t session, content_type_t type,
 
       cipher_size =
        _gnutls_encrypt (session, headers, RECORD_HEADER_SIZE, data,
-                        data2send_size, bufel->msg.data, cipher_size, type,
+                        data2send_size, _mbuffer_get_udata_ptr(bufel), cipher_size, type,
                         (session->internals.priorities.no_padding ==
                          0) ? 1 : 0);
       if (cipher_size <= 0)
@@ -434,7 +434,7 @@ _gnutls_send_int (gnutls_session_t session, content_type_t type,
          return GNUTLS_E_RECORD_LIMIT_REACHED;
        }
 
-      bufel->msg.size = cipher_size;
+      _mbuffer_set_udata_size(bufel, cipher_size);
       ret = _gnutls_io_write_buffered (session, bufel);
     }