|
@@ -409,7 +409,7 @@ static int __key_instantiate_and_link(struct key *key,
|
|
|
struct key_preparsed_payload *prep,
|
|
|
struct key *keyring,
|
|
|
struct key *authkey,
|
|
|
- unsigned long *_prealloc)
|
|
|
+ struct assoc_array_edit **_edit)
|
|
|
{
|
|
|
int ret, awaken;
|
|
|
|
|
@@ -436,7 +436,7 @@ static int __key_instantiate_and_link(struct key *key,
|
|
|
|
|
|
/* and link it into the destination keyring */
|
|
|
if (keyring)
|
|
|
- __key_link(keyring, key, _prealloc);
|
|
|
+ __key_link(key, _edit);
|
|
|
|
|
|
/* disable the authorisation key */
|
|
|
if (authkey)
|
|
@@ -476,7 +476,7 @@ int key_instantiate_and_link(struct key *key,
|
|
|
struct key *authkey)
|
|
|
{
|
|
|
struct key_preparsed_payload prep;
|
|
|
- unsigned long prealloc;
|
|
|
+ struct assoc_array_edit *edit;
|
|
|
int ret;
|
|
|
|
|
|
memset(&prep, 0, sizeof(prep));
|
|
@@ -490,16 +490,15 @@ int key_instantiate_and_link(struct key *key,
|
|
|
}
|
|
|
|
|
|
if (keyring) {
|
|
|
- ret = __key_link_begin(keyring, &key->index_key, &prealloc);
|
|
|
+ ret = __key_link_begin(keyring, &key->index_key, &edit);
|
|
|
if (ret < 0)
|
|
|
goto error_free_preparse;
|
|
|
}
|
|
|
|
|
|
- ret = __key_instantiate_and_link(key, &prep, keyring, authkey,
|
|
|
- &prealloc);
|
|
|
+ ret = __key_instantiate_and_link(key, &prep, keyring, authkey, &edit);
|
|
|
|
|
|
if (keyring)
|
|
|
- __key_link_end(keyring, &key->index_key, prealloc);
|
|
|
+ __key_link_end(keyring, &key->index_key, edit);
|
|
|
|
|
|
error_free_preparse:
|
|
|
if (key->type->preparse)
|
|
@@ -537,7 +536,7 @@ int key_reject_and_link(struct key *key,
|
|
|
struct key *keyring,
|
|
|
struct key *authkey)
|
|
|
{
|
|
|
- unsigned long prealloc;
|
|
|
+ struct assoc_array_edit *edit;
|
|
|
struct timespec now;
|
|
|
int ret, awaken, link_ret = 0;
|
|
|
|
|
@@ -548,7 +547,7 @@ int key_reject_and_link(struct key *key,
|
|
|
ret = -EBUSY;
|
|
|
|
|
|
if (keyring)
|
|
|
- link_ret = __key_link_begin(keyring, &key->index_key, &prealloc);
|
|
|
+ link_ret = __key_link_begin(keyring, &key->index_key, &edit);
|
|
|
|
|
|
mutex_lock(&key_construction_mutex);
|
|
|
|
|
@@ -570,7 +569,7 @@ int key_reject_and_link(struct key *key,
|
|
|
|
|
|
/* and link it into the destination keyring */
|
|
|
if (keyring && link_ret == 0)
|
|
|
- __key_link(keyring, key, &prealloc);
|
|
|
+ __key_link(key, &edit);
|
|
|
|
|
|
/* disable the authorisation key */
|
|
|
if (authkey)
|
|
@@ -580,7 +579,7 @@ int key_reject_and_link(struct key *key,
|
|
|
mutex_unlock(&key_construction_mutex);
|
|
|
|
|
|
if (keyring)
|
|
|
- __key_link_end(keyring, &key->index_key, prealloc);
|
|
|
+ __key_link_end(keyring, &key->index_key, edit);
|
|
|
|
|
|
/* wake up anyone waiting for a key to be constructed */
|
|
|
if (awaken)
|
|
@@ -783,8 +782,8 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref,
|
|
|
.description = description,
|
|
|
};
|
|
|
struct key_preparsed_payload prep;
|
|
|
+ struct assoc_array_edit *edit;
|
|
|
const struct cred *cred = current_cred();
|
|
|
- unsigned long prealloc;
|
|
|
struct key *keyring, *key = NULL;
|
|
|
key_ref_t key_ref;
|
|
|
int ret;
|
|
@@ -828,7 +827,7 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref,
|
|
|
}
|
|
|
index_key.desc_len = strlen(index_key.description);
|
|
|
|
|
|
- ret = __key_link_begin(keyring, &index_key, &prealloc);
|
|
|
+ ret = __key_link_begin(keyring, &index_key, &edit);
|
|
|
if (ret < 0) {
|
|
|
key_ref = ERR_PTR(ret);
|
|
|
goto error_free_prep;
|
|
@@ -847,8 +846,8 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref,
|
|
|
* update that instead if possible
|
|
|
*/
|
|
|
if (index_key.type->update) {
|
|
|
- key_ref = __keyring_search_one(keyring_ref, &index_key);
|
|
|
- if (!IS_ERR(key_ref))
|
|
|
+ key_ref = find_key_to_update(keyring_ref, &index_key);
|
|
|
+ if (key_ref)
|
|
|
goto found_matching_key;
|
|
|
}
|
|
|
|
|
@@ -874,7 +873,7 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref,
|
|
|
}
|
|
|
|
|
|
/* instantiate it and link it into the target keyring */
|
|
|
- ret = __key_instantiate_and_link(key, &prep, keyring, NULL, &prealloc);
|
|
|
+ ret = __key_instantiate_and_link(key, &prep, keyring, NULL, &edit);
|
|
|
if (ret < 0) {
|
|
|
key_put(key);
|
|
|
key_ref = ERR_PTR(ret);
|
|
@@ -884,7 +883,7 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref,
|
|
|
key_ref = make_key_ref(key, is_key_possessed(keyring_ref));
|
|
|
|
|
|
error_link_end:
|
|
|
- __key_link_end(keyring, &index_key, prealloc);
|
|
|
+ __key_link_end(keyring, &index_key, edit);
|
|
|
error_free_prep:
|
|
|
if (index_key.type->preparse)
|
|
|
index_key.type->free_preparse(&prep);
|
|
@@ -897,7 +896,7 @@ error:
|
|
|
/* we found a matching key, so we're going to try to update it
|
|
|
* - we can drop the locks first as we have the key pinned
|
|
|
*/
|
|
|
- __key_link_end(keyring, &index_key, prealloc);
|
|
|
+ __key_link_end(keyring, &index_key, edit);
|
|
|
|
|
|
key_ref = __key_update(key_ref, &prep);
|
|
|
goto error_free_prep;
|