]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
str: added helper functions to read prefixed data with 8 or 16-bit headers
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Thu, 14 Sep 2017 09:21:51 +0000 (11:21 +0200)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Mon, 19 Feb 2018 14:29:33 +0000 (15:29 +0100)
Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
lib/str.c
lib/str.h

index bb7b25b08d22851b991870dfc80a35f2b167f551..17e4fe3b86eb768cb05e591f05613fc25b83255d 100644 (file)
--- a/lib/str.c
+++ b/lib/str.c
@@ -827,6 +827,68 @@ _gnutls_buffer_pop_datum_prefix(gnutls_buffer_st * buf,
        return 0;
 }
 
+int
+_gnutls_buffer_pop_datum_prefix16(gnutls_buffer_st * buf,
+                                 gnutls_datum_t * data)
+{
+       size_t size;
+
+       if (buf->length < 2) {
+               gnutls_assert();
+               return GNUTLS_E_PARSING_ERROR;
+       }
+
+       size = _gnutls_read_uint16(buf->data);
+
+       buf->data += 2;
+       buf->length -= 2;
+
+       if (size > 0) {
+               size_t osize = size;
+               _gnutls_buffer_pop_datum(buf, data, size);
+               if (osize != data->size) {
+                       gnutls_assert();
+                       return GNUTLS_E_PARSING_ERROR;
+               }
+       } else {
+               data->size = 0;
+               data->data = NULL;
+       }
+
+       return 0;
+}
+
+int
+_gnutls_buffer_pop_datum_prefix8(gnutls_buffer_st * buf,
+                                gnutls_datum_t * data)
+{
+       size_t size;
+
+       if (buf->length < 1) {
+               gnutls_assert();
+               return GNUTLS_E_PARSING_ERROR;
+       }
+
+       size = buf->data[0];
+
+       buf->data++;
+       buf->length--;
+
+       if (size > 0) {
+               size_t osize = size;
+               _gnutls_buffer_pop_datum(buf, data, size);
+               if (osize != data->size) {
+                       gnutls_assert();
+                       return GNUTLS_E_PARSING_ERROR;
+               }
+       } else {
+               data->size = 0;
+               data->data = NULL;
+       }
+
+       return 0;
+}
+
 int
 _gnutls_buffer_append_data_prefix(gnutls_buffer_st * buf,
                                  int pfx_size, const void *data,
index a51f6d7d6fe242e8d25990a7c3bf3c8a50788989..48dd15e314f8c02e72ba09f8a1850d8e34f69481 100644 (file)
--- a/lib/str.h
+++ b/lib/str.h
@@ -119,11 +119,22 @@ void _gnutls_buffer_pop_data(gnutls_buffer_st *, void *, size_t * size);
 void _gnutls_buffer_pop_datum(gnutls_buffer_st *, gnutls_datum_t *,
                              size_t max_size);
 
+/* 32-bit prefix */
 int _gnutls_buffer_pop_prefix(gnutls_buffer_st * buf, size_t * data_size,
                              int check);
 
+/* 32-bit prefix */
 int _gnutls_buffer_pop_datum_prefix(gnutls_buffer_st * buf,
                                    gnutls_datum_t * data);
+
+/* 16-bit prefix */
+int _gnutls_buffer_pop_datum_prefix16(gnutls_buffer_st * buf,
+                                     gnutls_datum_t * data);
+
+/* 8-bit prefix */
+int _gnutls_buffer_pop_datum_prefix8(gnutls_buffer_st * buf,
+                                    gnutls_datum_t * data);
+
 int _gnutls_buffer_to_datum(gnutls_buffer_st * str, gnutls_datum_t * data, unsigned is_str);
 
 int