]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
str: allow creating a read-only buffer
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Wed, 20 Sep 2017 13:21:16 +0000 (15:21 +0200)
committerNikos Mavrogiannopoulos <nmav@redhat.com>
Mon, 19 Feb 2018 14:29:34 +0000 (15:29 +0100)
Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
lib/str.c
lib/str.h

index 8400edc5d9cb83d621b5b5173f33e7bc9696941b..2f03ac9a62f210169ed525f394bf2fc197d8f320 100644 (file)
--- a/lib/str.c
+++ b/lib/str.c
@@ -123,6 +123,9 @@ gnutls_buffer_append_data(gnutls_buffer_t dest, const void *data,
        size_t const tot_len = data_size + dest->length;
        size_t const unused = MEMSUB(dest->data, dest->allocd);
 
+       if (unlikely(dest->data != NULL && dest->allocd == NULL))
+               return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
        if (data_size == 0)
                return 0;
 
@@ -160,6 +163,9 @@ gnutls_buffer_append_data(gnutls_buffer_t dest, const void *data,
 
 int _gnutls_buffer_resize(gnutls_buffer_st * dest, size_t new_size)
 {
+       if (unlikely(dest->data != NULL && dest->allocd == NULL))
+               return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST);
+
        if (dest->max_length >= new_size) {
                size_t unused = MEMSUB(dest->data, dest->allocd);
                if (dest->max_length - unused <= new_size) {
@@ -209,7 +215,6 @@ void
 _gnutls_buffer_pop_datum(gnutls_buffer_st * str, gnutls_datum_t * data,
                         size_t req_size)
 {
-
        if (str->length == 0) {
                data->data = NULL;
                data->size = 0;
index f33dfb9b664405a477fd962879e550caf3195c0b..41bec26a717b53a61f92a6335a0fd817ab769d23 100644 (file)
--- a/lib/str.h
+++ b/lib/str.h
@@ -137,6 +137,15 @@ int _gnutls_buffer_pop_datum_prefix8(gnutls_buffer_st * buf,
 
 int _gnutls_buffer_to_datum(gnutls_buffer_st * str, gnutls_datum_t * data, unsigned is_str);
 
+inline static
+void _gnutls_ro_buffer_from_datum(gnutls_buffer_st * str, gnutls_datum_t * data)
+{
+       _gnutls_buffer_init(str);
+       str->length = data->size;
+       str->max_length = data->size;
+       str->data = data->data;
+}
+
 int
 _gnutls_buffer_append_escape(gnutls_buffer_st * dest, const void *data,
                             size_t data_size, const char *invalid_chars);