diff options
author | Tim Rühsen <tim.ruehsen@gmx.de> | 2019-02-14 11:07:15 +0000 |
---|---|---|
committer | Tim Rühsen <tim.ruehsen@gmx.de> | 2019-02-14 11:07:15 +0000 |
commit | dafc1f6b124ed2ae9c62bb2a6c26bcc311264b4a (patch) | |
tree | 17cd81aec1a6bae3fdc145f4592de87e0ed05371 | |
parent | 1b8703fb1a748a973f6c7c60269632218ab77596 (diff) | |
parent | 588e4f316bce9f47fe38fbc6a4058627b7e44078 (diff) | |
download | gnutls-dafc1f6b124ed2ae9c62bb2a6c26bcc311264b4a.tar.gz |
Merge branch 'tmp-fix-uninitialized2' into 'master'
Fix uninitialized warning in pkcs11.c
See merge request gnutls/gnutls!906
-rw-r--r-- | lib/pkcs11.c | 42 | ||||
-rw-r--r-- | tests/pkcs11/pkcs11-token-raw.c | 37 |
2 files changed, 53 insertions, 26 deletions
diff --git a/lib/pkcs11.c b/lib/pkcs11.c index 39e2799b1e..80d7c57b1f 100644 --- a/lib/pkcs11.c +++ b/lib/pkcs11.c @@ -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); diff --git a/tests/pkcs11/pkcs11-token-raw.c b/tests/pkcs11/pkcs11-token-raw.c index bbcb23eb81..c09e762cc5 100644 --- a/tests/pkcs11/pkcs11-token-raw.c +++ b/tests/pkcs11/pkcs11-token-raw.c @@ -57,6 +57,7 @@ static void tls_log_func(int level, const char *str) fprintf(stderr, "|<%d>| %s", level, str); } +#define TOKEN_NAME "whatever" void doit(void) { int ret; @@ -93,6 +94,42 @@ void doit(void) exit(1); } + { + static const char url[] = "pkcs11:token="TOKEN_NAME; + + /* Testing a too small buffer */ + size_t size = 1; + char *buf = gnutls_malloc(size); + assert(buf != NULL); + ret = gnutls_pkcs11_token_get_info(url, + GNUTLS_PKCS11_TOKEN_LABEL, + buf, &size); + assert(ret == GNUTLS_E_SHORT_MEMORY_BUFFER); + assert(size == strlen(TOKEN_NAME)+1); + + /* Testing a too small buffer by one */ + size -= 1; + buf = gnutls_realloc(buf, size); + assert(buf != NULL); + ret = gnutls_pkcs11_token_get_info(url, + GNUTLS_PKCS11_TOKEN_LABEL, + buf, &size); + assert(ret == GNUTLS_E_SHORT_MEMORY_BUFFER); + assert(size == strlen(TOKEN_NAME)+1); + + /* Testing an exactly fitting buffer */ + buf = gnutls_realloc(buf, size); + assert(buf != NULL); + ret = gnutls_pkcs11_token_get_info(url, + GNUTLS_PKCS11_TOKEN_LABEL, + buf, &size); + assert(ret == 0); + assert(strcmp(buf, TOKEN_NAME) == 0); + assert(size == strlen(TOKEN_NAME)); + + 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); |