]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
str: added _gnutls_buffer_pop_prefix24 and _gnutls_buffer_pop_prefix8
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Wed, 20 Sep 2017 13:33:16 +0000 (15:33 +0200)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Mon, 19 Feb 2018 14:29:34 +0000 (15:29 +0100)
Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
lib/str.c
lib/str.h

index 513cbbc9cea02c768d12226e2bc16c0efd0b49b4..0571defa87b32a5aef9a5a01b7df239e1f084467 100644 (file)
--- a/lib/str.c
+++ b/lib/str.c
@@ -806,6 +806,51 @@ _gnutls_buffer_pop_prefix32(gnutls_buffer_st * buf, size_t * data_size,
        return 0;
 }
 
+int _gnutls_buffer_pop_prefix8(gnutls_buffer_st *buf, uint8_t *data, int check)
+{
+       if (buf->length < 1) {
+               gnutls_assert();
+               return GNUTLS_E_PARSING_ERROR;
+       }
+
+       *data = buf->data[0];
+
+       if (check && *data > buf->length - 1) {
+               gnutls_assert();
+               return GNUTLS_E_PARSING_ERROR;
+       }
+
+       buf->data++;
+       buf->length--;
+
+       return 0;
+}
+
+int
+_gnutls_buffer_pop_prefix24(gnutls_buffer_st * buf, size_t * data_size,
+                           int check)
+{
+       size_t size;
+
+       if (buf->length < 3) {
+               gnutls_assert();
+               return GNUTLS_E_PARSING_ERROR;
+       }
+
+       size = _gnutls_read_uint24(buf->data);
+       if (check && size > buf->length - 3) {
+               gnutls_assert();
+               return GNUTLS_E_PARSING_ERROR;
+       }
+
+       buf->data += 3;
+       buf->length -= 3;
+
+       *data_size = size;
+
+       return 0;
+}
+
 int
 _gnutls_buffer_pop_datum_prefix32(gnutls_buffer_st * buf,
                                  gnutls_datum_t * data)
index 41bec26a717b53a61f92a6335a0fd817ab769d23..594693db5bb749a4ba692fa23d6c239486b5f333 100644 (file)
--- a/lib/str.h
+++ b/lib/str.h
@@ -119,10 +119,15 @@ 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);
 
+int _gnutls_buffer_pop_prefix8(gnutls_buffer_st *, uint8_t *, int check);
+
 /* 32-bit prefix */
 int _gnutls_buffer_pop_prefix32(gnutls_buffer_st * buf, size_t * data_size,
                                int check);
 
+int _gnutls_buffer_pop_prefix24(gnutls_buffer_st * buf, size_t * data_size,
+                               int check);
+
 /* 32-bit prefix */
 int _gnutls_buffer_pop_datum_prefix32(gnutls_buffer_st * buf,
                                      gnutls_datum_t * data);