From: Nikos Mavrogiannopoulos Date: Wed, 20 Sep 2017 13:33:16 +0000 (+0200) Subject: str: added _gnutls_buffer_pop_prefix24 and _gnutls_buffer_pop_prefix8 X-Git-Tag: gnutls_3_6_3~383 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e2c71dbca74f0ad4ac20a214536f25b1bc6b059e;p=thirdparty%2Fgnutls.git str: added _gnutls_buffer_pop_prefix24 and _gnutls_buffer_pop_prefix8 Signed-off-by: Nikos Mavrogiannopoulos --- diff --git a/lib/str.c b/lib/str.c index 513cbbc9ce..0571defa87 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);