From 80e0567f2e8309ce71bdbb09f6324b6612d45adb Mon Sep 17 00:00:00 2001 From: Nikos Mavrogiannopoulos Date: Wed, 20 Sep 2017 15:33:16 +0200 Subject: str: added _gnutls_buffer_pop_prefix24 and _gnutls_buffer_pop_prefix8 Signed-off-by: Nikos Mavrogiannopoulos --- lib/str.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ lib/str.h | 5 +++++ 2 files changed, 50 insertions(+) diff --git a/lib/str.c b/lib/str.c index dc131818a3..1a878d36ba 100644 --- 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) diff --git a/lib/str.h b/lib/str.h index 41bec26a71..594693db5b 100644 --- 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); -- cgit v1.2.1