From: Nikos Mavrogiannopoulos Date: Wed, 27 Aug 2014 08:02:36 +0000 (+0200) Subject: gnutls_pkcs11_obj_list_import_url2() will import data in a single pass X-Git-Tag: gnutls_3_4_0~1021 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=64c5ff5eb265c67cb547906e04bbb77323cb4a4b;p=thirdparty%2Fgnutls.git gnutls_pkcs11_obj_list_import_url2() will import data in a single pass --- diff --git a/lib/pkcs11.c b/lib/pkcs11.c index d48a2d2ce8..030d5f8d17 100644 --- a/lib/pkcs11.c +++ b/lib/pkcs11.c @@ -67,7 +67,6 @@ struct find_url_data_st { struct find_obj_data_st { gnutls_pkcs11_obj_t *p_list; - unsigned int *n_list; unsigned int current; gnutls_pkcs11_obj_attr_t flags; struct p11_kit_uri *info; @@ -1601,7 +1600,7 @@ pkcs11_import_object(ck_object_handle_t obj, ck_object_class_t class, a[0].value_len = MAX_CERT_SIZE; rv = pkcs11_get_attribute_value - (sinfo->module, sinfo->pks, obj, a, 2); + (sinfo->module, sinfo->pks, obj, a, 1); if (rv == CKR_OK) { data.data = a[0].value; data.size = a[0].value_len; @@ -1717,7 +1716,6 @@ find_obj_url_cb(struct pkcs11_session_info *sinfo, if (pkcs11_find_objects(sinfo->module, sinfo->pks, &obj, 1, &count) == CKR_OK && count == 1) { - ret = pkcs11_import_object(obj, class, sinfo, info, lib_info, find_data->obj); if (ret >= 0) { found = 1; @@ -2397,15 +2395,9 @@ find_objs_cb(struct pkcs11_session_info *sinfo, struct find_pkey_list_st plist; /* private key holder */ unsigned int i, tot_values = 0; - if (info == NULL) { /* final call */ - if (find_data->current <= *find_data->n_list) - ret = 0; - else - ret = GNUTLS_E_SHORT_MEMORY_BUFFER; - - *find_data->n_list = find_data->current; - - return ret; + if (info == NULL) { + gnutls_assert(); + return 0; } /* do not bother reading the token if basic fields do not match @@ -2568,18 +2560,25 @@ find_objs_cb(struct pkcs11_session_info *sinfo, return pkcs11_rv_to_err(rv); } - objs = gnutls_malloc(OBJECTS_A_TIME*sizeof(*objs)); + objs = gnutls_malloc(OBJECTS_A_TIME*sizeof(objs[0])); if (objs == NULL) { ret = gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); goto fail; } + find_data->p_list = gnutls_realloc_fast(find_data->p_list, (find_data->current+OBJECTS_A_TIME)*sizeof(find_data->p_list[0])); + if (find_data->p_list == NULL) { + ret = gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); + goto fail; + } + while (pkcs11_find_objects (sinfo->module, sinfo->pks, objs, OBJECTS_A_TIME, &count) == CKR_OK && count > 0) { unsigned j; gnutls_datum_t id; + class = -1; for (j=0;jcurrent < *find_data->n_list) { - ret = - gnutls_pkcs11_obj_init(&find_data->p_list - [find_data->current]); - if (ret < 0) { - gnutls_assert(); - goto fail; - } + ret = + gnutls_pkcs11_obj_init(&find_data->p_list + [find_data->current]); + if (ret < 0) { + gnutls_assert(); + goto fail; + } - ret = pkcs11_import_object(objs[j], class, sinfo, - info, lib_info, - find_data->p_list[find_data->current]); - if (ret < 0) { - gnutls_assert(); - goto fail; - } - } + ret = pkcs11_import_object(objs[j], class, sinfo, + info, lib_info, + find_data->p_list[find_data->current]); + if (ret < 0) { + gnutls_assert(); + /* skip the failed object */ + continue; + } find_data->current++; } @@ -2661,6 +2659,8 @@ find_objs_cb(struct pkcs11_session_info *sinfo, for (i = 0; i < find_data->current; i++) { gnutls_pkcs11_obj_deinit(find_data->p_list[i]); } + gnutls_free(find_data->p_list); + find_data->p_list = NULL; find_data->current = 0; return ret; @@ -2691,16 +2691,14 @@ gnutls_pkcs11_obj_list_import_url(gnutls_pkcs11_obj_t * p_list, { int ret; struct find_obj_data_st priv; + unsigned i; PKCS11_CHECK_INIT; memset(&priv, 0, sizeof(priv)); /* fill in the find data structure */ - priv.p_list = p_list; - priv.n_list = n_list; priv.flags = attrs; - priv.current = 0; if (url == NULL || url[0] == 0) { url = "pkcs11:"; @@ -2726,6 +2724,19 @@ gnutls_pkcs11_obj_list_import_url(gnutls_pkcs11_obj_t * p_list, return ret; } + if (priv.current > *n_list) { + *n_list = priv.current; + for (i=0;i