diff options
author | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2017-09-14 11:21:51 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@redhat.com> | 2017-09-18 09:14:43 +0200 |
commit | 13cc9921976a092e76adeb5bf3ed82b50cefb978 (patch) | |
tree | fc7b6e3c00df31050749ed194de854ae7dee9efa | |
parent | 42392c520d46485c15ae226ae4154276a1b77946 (diff) | |
download | gnutls-13cc9921976a092e76adeb5bf3ed82b50cefb978.tar.gz |
str: added helper functions to read prefixed data with 8 or 16-bit headers
Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
-rw-r--r-- | lib/str.c | 62 | ||||
-rw-r--r-- | lib/str.h | 11 |
2 files changed, 73 insertions, 0 deletions
@@ -828,6 +828,68 @@ _gnutls_buffer_pop_datum_prefix(gnutls_buffer_st * buf, } 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, size_t data_size) @@ -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 |