summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Rühsen <tim.ruehsen@gmx.de>2019-02-14 11:07:15 +0000
committerTim Rühsen <tim.ruehsen@gmx.de>2019-02-14 11:07:15 +0000
commitdafc1f6b124ed2ae9c62bb2a6c26bcc311264b4a (patch)
tree17cd81aec1a6bae3fdc145f4592de87e0ed05371
parent1b8703fb1a748a973f6c7c60269632218ab77596 (diff)
parent588e4f316bce9f47fe38fbc6a4058627b7e44078 (diff)
downloadgnutls-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.c42
-rw-r--r--tests/pkcs11/pkcs11-token-raw.c37
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);