From: Nikos Mavrogiannopoulos Date: Tue, 23 Dec 2014 11:29:13 +0000 (+0200) Subject: better cleanup in gnutls_pkcs11_privkey_import_url and allow reuse X-Git-Tag: gnutls_3_4_0~439 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b01133da591bdc788e390d95fcbe4eb0fedb22a2;p=thirdparty%2Fgnutls.git better cleanup in gnutls_pkcs11_privkey_import_url and allow reuse --- diff --git a/lib/pkcs11_privkey.c b/lib/pkcs11_privkey.c index a80f05e4a5..9bf8737478 100644 --- a/lib/pkcs11_privkey.c +++ b/lib/pkcs11_privkey.c @@ -403,6 +403,16 @@ gnutls_pkcs11_privkey_import_url(gnutls_pkcs11_privkey_t pkey, memset(&pkey->sinfo, 0, sizeof(pkey->sinfo)); + if (pkey->url) { + gnutls_free(pkey->url); + pkey->url = NULL; + } + + if (pkey->uinfo) { + p11_kit_uri_free(pkey->uinfo); + pkey->uinfo = NULL; + } + pkey->url = gnutls_strdup(url); if (pkey->url == NULL) return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); @@ -410,7 +420,7 @@ gnutls_pkcs11_privkey_import_url(gnutls_pkcs11_privkey_t pkey, ret = pkcs11_url_to_info(pkey->url, &pkey->uinfo, flags|GNUTLS_PKCS11_OBJ_FLAG_EXPECT_PRIVKEY); if (ret < 0) { gnutls_assert(); - return ret; + goto cleanup; } pkey->flags = flags; @@ -419,7 +429,8 @@ gnutls_pkcs11_privkey_import_url(gnutls_pkcs11_privkey_t pkey, if (!attr || attr->value_len != sizeof(ck_object_class_t) || *(ck_object_class_t *) attr->value != CKO_PRIVATE_KEY) { gnutls_assert(); - return GNUTLS_E_INVALID_REQUEST; + ret = GNUTLS_E_INVALID_REQUEST; + goto cleanup; } attr = p11_kit_uri_get_attribute(pkey->uinfo, CKA_ID); @@ -427,7 +438,8 @@ gnutls_pkcs11_privkey_import_url(gnutls_pkcs11_privkey_t pkey, attr = p11_kit_uri_get_attribute(pkey->uinfo, CKA_LABEL); if (!attr) { gnutls_assert(); - return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE; + ret = GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE; + goto cleanup; } } @@ -462,7 +474,12 @@ gnutls_pkcs11_privkey_import_url(gnutls_pkcs11_privkey_t pkey, return ret; cleanup: - pkcs11_close_session(&pkey->sinfo); + if (pkey->uinfo != NULL) { + p11_kit_uri_free(pkey->uinfo); + pkey->uinfo = NULL; + } + gnutls_free(pkey->url); + pkey->url = NULL; return ret; }