]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
Fix uninitialized warning in pkcs11.c
authorTim Rühsen <tim.ruehsen@gmx.de>
Tue, 29 Jan 2019 15:10:59 +0000 (16:10 +0100)
committerTim Rühsen <tim.ruehsen@gmx.de>
Thu, 14 Feb 2019 09:29:25 +0000 (10:29 +0100)
Signed-off-by: Tim Rühsen <tim.ruehsen@gmx.de>
lib/pkcs11.c
tests/pkcs11/pkcs11-token-raw.c

index 39e2799b1ede917e4bb8aa81893bc3ce574d395e..80d7c57b1fcad474fd2be441636e222bfcf2d8eb 100644 (file)
@@ -2475,7 +2475,6 @@ gnutls_pkcs11_token_get_info(const char *url,
 {
        struct p11_kit_uri *info = NULL;
        const uint8_t *str;
-       size_t str_max;
        char *temp_str = NULL;
        size_t len;
        int ret;
@@ -2491,19 +2490,19 @@ gnutls_pkcs11_token_get_info(const char *url,
        switch (ttype) {
        case GNUTLS_PKCS11_TOKEN_LABEL:
                str = p11_kit_uri_get_token_info(info)->label;
-               str_max = 32;
+               len = p11_kit_space_strlen(str, 32);
                break;
        case GNUTLS_PKCS11_TOKEN_SERIAL:
                str = p11_kit_uri_get_token_info(info)->serial_number;
-               str_max = 16;
+               len = p11_kit_space_strlen(str, 16);
                break;
        case GNUTLS_PKCS11_TOKEN_MANUFACTURER:
                str = p11_kit_uri_get_token_info(info)->manufacturer_id;
-               str_max = 32;
+               len = p11_kit_space_strlen(str, 32);
                break;
        case GNUTLS_PKCS11_TOKEN_MODEL:
                str = p11_kit_uri_get_token_info(info)->model;
-               str_max = 16;
+               len = p11_kit_space_strlen(str, 16);
                break;
        case GNUTLS_PKCS11_TOKEN_MODNAME: {
                struct find_token_modname tn;
@@ -2518,11 +2517,12 @@ gnutls_pkcs11_token_get_info(const char *url,
                }
 
                temp_str = tn.modname;
-               if (temp_str == NULL) {
-                       gnutls_assert();
-                       str_max = 0;
-               } else {
+               if (temp_str) {
                        str = (uint8_t *)temp_str;
+                       len = strlen(temp_str);
+               } else {
+                       gnutls_assert();
+                       len = 0;
                }
                break;
        }
@@ -2532,27 +2532,17 @@ gnutls_pkcs11_token_get_info(const char *url,
                goto cleanup;
        }
 
-       if (temp_str)
-               len = strlen(temp_str);
-       else if (str_max == 0)
-               len = 0;
-       else
-               len = p11_kit_space_strlen(str, str_max);
-
-       if (len + 1 > *output_size) {
+       if (len < *output_size) {
+               if (len)
+                       memcpy(output, str, len);
+               ((char *) output)[len] = '\0';
+               *output_size = len;
+               ret = 0;
+       } else {
                *output_size = len + 1;
                ret = GNUTLS_E_SHORT_MEMORY_BUFFER;
-               goto cleanup;
        }
 
-       if (len)
-               memcpy(output, str, len);
-       ((char *) output)[len] = '\0';
-
-       *output_size = len;
-
-       ret = 0;
-
  cleanup:
        free(temp_str);
        p11_kit_uri_free(info);
index bbcb23eb81a71499fc55c1e997b0d420231c3ba2..605c96ce1dee713bd6d9a30a26d5e76bef6c3c5d 100644 (file)
@@ -93,6 +93,36 @@ void doit(void)
                exit(1);
        }
 
+       {
+               static const char url[] = "pkcs11:token=whatever";
+
+               /* Testing a too small buffer */
+               size_t size = 1;
+               char *buf = gnutls_malloc(size);
+               ret = gnutls_pkcs11_token_get_info(url,
+                       GNUTLS_PKCS11_TOKEN_LABEL,
+                       buf, &size);
+               assert(ret == GNUTLS_E_SHORT_MEMORY_BUFFER);
+
+               /* Testing a too small buffer by one */
+               size -= 1;
+               buf = gnutls_realloc(buf, size);
+               ret = gnutls_pkcs11_token_get_info(url,
+                       GNUTLS_PKCS11_TOKEN_LABEL,
+                       buf, &size);
+               assert(ret == GNUTLS_E_SHORT_MEMORY_BUFFER);
+
+               /* Testing an exactly fitting buffer */
+               buf = gnutls_realloc(buf, size);
+               ret = gnutls_pkcs11_token_get_info(url,
+                       GNUTLS_PKCS11_TOKEN_LABEL,
+                       buf, &size);
+               assert(ret == 0);
+               assert(strcmp(buf, "whatever") == 0);
+
+               gnutls_free(buf);
+       }
+
        ret = gnutls_pkcs11_token_get_ptr("pkcs11:token=invalid", (void**)&mod, &slot_id, 0);
        assert(ret == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE);