diff options
author | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2017-09-20 15:33:16 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2017-10-10 18:09:00 +0200 |
commit | 80e0567f2e8309ce71bdbb09f6324b6612d45adb (patch) | |
tree | ad1632023ad9d640b9123a62973e80c237f93935 | |
parent | 98b4762ca9707156102ba075c089acc659d60fbb (diff) | |
download | gnutls-80e0567f2e8309ce71bdbb09f6324b6612d45adb.tar.gz |
str: added _gnutls_buffer_pop_prefix24 and _gnutls_buffer_pop_prefix8
Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
-rw-r--r-- | lib/str.c | 45 | ||||
-rw-r--r-- | lib/str.h | 5 |
2 files changed, 50 insertions, 0 deletions
@@ -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) @@ -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); |