summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2017-09-20 15:33:16 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2017-10-10 18:09:00 +0200
commit80e0567f2e8309ce71bdbb09f6324b6612d45adb (patch)
treead1632023ad9d640b9123a62973e80c237f93935
parent98b4762ca9707156102ba075c089acc659d60fbb (diff)
downloadgnutls-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.c45
-rw-r--r--lib/str.h5
2 files changed, 50 insertions, 0 deletions
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);