]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
_gnutls_set_[str]datum: Cleanup, add function attributes
authorTim Rühsen <tim.ruehsen@gmx.de>
Mon, 20 May 2019 10:46:54 +0000 (12:46 +0200)
committerTim Rühsen <tim.ruehsen@gmx.de>
Tue, 28 May 2019 13:19:13 +0000 (15:19 +0200)
_gnutls_set_datum(): Do not change output 'dat' on error
_gnutls_set_strdatum: Likewise, cleanup code

Signed-off-by: Tim Rühsen <tim.ruehsen@gmx.de>
lib/datum.c
lib/datum.h

index ff71068b99c6e8286d57a001e5aa98e5e3636c71..bd0f216438e3a5afb3c0ae6945e271023acfbfdd 100644 (file)
@@ -30,6 +30,7 @@
 #include <datum.h>
 #include "errors.h"
 
+/* On error, @dat is not changed. */
 int
 _gnutls_set_datum(gnutls_datum_t * dat, const void *data, size_t data_size)
 {
@@ -39,10 +40,11 @@ _gnutls_set_datum(gnutls_datum_t * dat, const void *data, size_t data_size)
                return 0;
        }
 
-       dat->data = gnutls_malloc(data_size);
-       if (dat->data == NULL)
+       unsigned char *m = gnutls_malloc(data_size);
+       if (!m)
                return GNUTLS_E_MEMORY_ERROR;
 
+       dat->data = m;
        dat->size = data_size;
        memcpy(dat->data, data, data_size);
 
@@ -51,22 +53,22 @@ _gnutls_set_datum(gnutls_datum_t * dat, const void *data, size_t data_size)
 
 /* ensures that the data set are null-terminated
  * The function always returns an allocated string in @dat on success.
+ * On error, @dat is not changed.
  */
 int
 _gnutls_set_strdatum(gnutls_datum_t * dat, const void *data, size_t data_size)
 {
-       if (data_size == 0 || data == NULL) {
-               dat->data = gnutls_calloc(1, 1);
-               dat->size = 0;
-               return 0;
-       }
+       if (data == NULL)
+               return gnutls_assert_val(GNUTLS_E_ILLEGAL_PARAMETER);
 
-       dat->data = gnutls_malloc(data_size+1);
-       if (dat->data == NULL)
+       unsigned char *m = gnutls_malloc(data_size + 1);
+       if (!m)
                return GNUTLS_E_MEMORY_ERROR;
 
+       dat->data = m;
        dat->size = data_size;
-       memcpy(dat->data, data, data_size);
+       if (data_size)
+               memcpy(dat->data, data, data_size);
        dat->data[data_size] = 0;
 
        return 0;
index cdab4b272d986eb665b5b5200774a768d9c9888d..fe847359b015576cb4c198ba4ac3866ff6c965f2 100644 (file)
 /* This will copy the provided data in @dat. If the provided data are
  * NULL or zero-size @dat will be NULL as well.
  */
+warn_unused_result nonnull((1))
 int _gnutls_set_datum(gnutls_datum_t * dat, const void *data,
                      size_t data_size);
 
 /* This will always return a non-NULL, and zero-terminated string in @dat.
  */
+warn_unused_result nonnull((1))
 int _gnutls_set_strdatum(gnutls_datum_t * dat, const void *data,
                         size_t data_size);
 
@@ -40,17 +42,13 @@ int _gnutls_set_strdatum(gnutls_datum_t * dat, const void *data,
 inline static
 void _gnutls_free_datum(gnutls_datum_t * dat)
 {
-       if (dat == NULL)
-               return;
-
-       if (dat->data != NULL)
+       if (dat != NULL) {
                gnutls_free(dat->data);
-
-       dat->data = NULL;
-       dat->size = 0;
+               dat->size = 0;
+       }
 }
 
-inline static
+inline static nonnull_all
 void _gnutls_free_temp_key_datum(gnutls_datum_t * dat)
 {
        if (dat->data != NULL) {
@@ -58,11 +56,10 @@ void _gnutls_free_temp_key_datum(gnutls_datum_t * dat)
                gnutls_free(dat->data);
        }
 
-       dat->data = NULL;
        dat->size = 0;
 }
 
-inline static
+inline static nonnull_all
 void _gnutls_free_key_datum(gnutls_datum_t * dat)
 {
        if (dat->data != NULL) {
@@ -70,7 +67,6 @@ void _gnutls_free_key_datum(gnutls_datum_t * dat)
                gnutls_free(dat->data);
        }
 
-       dat->data = NULL;
        dat->size = 0;
 }