summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2017-09-29 09:08:59 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2018-02-19 15:29:35 +0100
commit344633626c9c497a61d975f22f83f227934b4c21 (patch)
treef7b42ea918cb53141747f90103580a9ae4fd2965
parent8c107a11041c6a093dca78fd159f88dbfb307bbc (diff)
downloadgnutls-344633626c9c497a61d975f22f83f227934b4c21.tar.gz
buf: _gnutls_buffer_pop_data made easier to use
Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
-rw-r--r--lib/str.c17
-rw-r--r--lib/str.h7
-rw-r--r--lib/tpm.c6
3 files changed, 16 insertions, 14 deletions
diff --git a/lib/str.c b/lib/str.c
index 378cedfa0c..c8d742e91e 100644
--- a/lib/str.c
+++ b/lib/str.c
@@ -280,24 +280,23 @@ int _gnutls_buffer_to_datum(gnutls_buffer_st * str, gnutls_datum_t * data, unsig
return ret;
}
-/* returns data from a string in a constant buffer.
+/* returns data from a string in a constant buffer. Will
+ * fail with GNUTLS_E_PARSING_ERROR, if the string has not enough data.
*/
-void
+int
_gnutls_buffer_pop_data(gnutls_buffer_st * str, void *data,
- size_t * req_size)
+ size_t req_size)
{
gnutls_datum_t tdata;
- _gnutls_buffer_pop_datum(str, &tdata, *req_size);
- if (tdata.data == NULL) {
- *req_size = 0;
- return;
+ _gnutls_buffer_pop_datum(str, &tdata, req_size);
+ if (tdata.data == NULL || tdata.size != req_size) {
+ return GNUTLS_E_PARSING_ERROR;
}
- *req_size = tdata.size;
memcpy(data, tdata.data, tdata.size);
- return;
+ return 0;
}
int
diff --git a/lib/str.h b/lib/str.h
index ba4efefb66..da472eb4f7 100644
--- a/lib/str.h
+++ b/lib/str.h
@@ -112,7 +112,7 @@ int _gnutls_buffer_append_fixed_mpi(gnutls_buffer_st * buf,
int _gnutls_buffer_append_data_prefix(gnutls_buffer_st * buf, int pfx_size,
const void *data, size_t data_size);
-void _gnutls_buffer_pop_data(gnutls_buffer_st *, void *, size_t * size);
+int _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);
@@ -234,9 +234,8 @@ int _gnutls_hostname_compare(const char *certname, size_t certnamesize,
}
#define BUFFER_POP(b, x, s) { \
- size_t is = s; \
- _gnutls_buffer_pop_data(b, x, &is); \
- if (is != s) { \
+ ret = _gnutls_buffer_pop_data(b, x, s); \
+ if (ret < 0) { \
ret = GNUTLS_E_PARSING_ERROR; \
gnutls_assert(); \
goto error; \
diff --git a/lib/tpm.c b/lib/tpm.c
index 1d63f83cb1..30f078f5ef 100644
--- a/lib/tpm.c
+++ b/lib/tpm.c
@@ -798,7 +798,11 @@ unescape_string(char *output, const char *input, size_t * size,
return ret;
}
- _gnutls_buffer_pop_data(&str, output, size);
+ ret = _gnutls_buffer_pop_data(&str, output, str.length);
+ if (ret < 0) {
+ gnutls_assert();
+ return ret;
+ }
_gnutls_buffer_clear(&str);