Skip to content

Commit

Permalink
KEYS: Provide a generic instantiation function
Browse files Browse the repository at this point in the history
Provide a generic instantiation function for key types that use the preparse
hook.  This makes it easier to prereserve key quota before keyrings get locked
to retain the new key.

Signed-off-by: David Howells <[email protected]>
Acked-by: Steve Dickson <[email protected]>
Acked-by: Jeff Layton <[email protected]>
Reviewed-by: Sage Weil <[email protected]>
  • Loading branch information
dhowells committed Jul 18, 2014
1 parent 32c2e67 commit 6a09d17
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 24 deletions.
25 changes: 1 addition & 24 deletions crypto/asymmetric_keys/asymmetric_type.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,29 +163,6 @@ static void asymmetric_key_free_preparse(struct key_preparsed_payload *prep)
kfree(prep->description);
}

/*
* Instantiate a asymmetric_key defined key. The key was preparsed, so we just
* have to transfer the data here.
*/
static int asymmetric_key_instantiate(struct key *key, struct key_preparsed_payload *prep)
{
int ret;

pr_devel("==>%s()\n", __func__);

ret = key_payload_reserve(key, prep->quotalen);
if (ret == 0) {
key->type_data.p[0] = prep->type_data[0];
key->type_data.p[1] = prep->type_data[1];
key->payload.data = prep->payload;
prep->type_data[0] = NULL;
prep->type_data[1] = NULL;
prep->payload = NULL;
}
pr_devel("<==%s() = %d\n", __func__, ret);
return ret;
}

/*
* dispose of the data dangling from the corpse of a asymmetric key
*/
Expand All @@ -205,7 +182,7 @@ struct key_type key_type_asymmetric = {
.name = "asymmetric",
.preparse = asymmetric_key_preparse,
.free_preparse = asymmetric_key_free_preparse,
.instantiate = asymmetric_key_instantiate,
.instantiate = generic_key_instantiate,
.match = asymmetric_key_match,
.destroy = asymmetric_key_destroy,
.describe = asymmetric_key_describe,
Expand Down
2 changes: 2 additions & 0 deletions include/linux/key-type.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,5 +159,7 @@ static inline int key_negate_and_link(struct key *key,
return key_reject_and_link(key, timeout, ENOKEY, keyring, instkey);
}

extern int generic_key_instantiate(struct key *key, struct key_preparsed_payload *prep);

#endif /* CONFIG_KEYS */
#endif /* _LINUX_KEY_TYPE_H */
30 changes: 30 additions & 0 deletions security/keys/key.c
Original file line number Diff line number Diff line change
Expand Up @@ -1023,6 +1023,36 @@ void key_invalidate(struct key *key)
}
EXPORT_SYMBOL(key_invalidate);

/**
* generic_key_instantiate - Simple instantiation of a key from preparsed data
* @key: The key to be instantiated
* @prep: The preparsed data to load.
*
* Instantiate a key from preparsed data. We assume we can just copy the data
* in directly and clear the old pointers.
*
* This can be pointed to directly by the key type instantiate op pointer.
*/
int generic_key_instantiate(struct key *key, struct key_preparsed_payload *prep)
{
int ret;

pr_devel("==>%s()\n", __func__);

ret = key_payload_reserve(key, prep->quotalen);
if (ret == 0) {
key->type_data.p[0] = prep->type_data[0];
key->type_data.p[1] = prep->type_data[1];
rcu_assign_keypointer(key, prep->payload);
prep->type_data[0] = NULL;
prep->type_data[1] = NULL;
prep->payload = NULL;
}
pr_devel("<==%s() = %d\n", __func__, ret);
return ret;
}
EXPORT_SYMBOL(generic_key_instantiate);

/**
* register_key_type - Register a type of key.
* @ktype: The new key type.
Expand Down

0 comments on commit 6a09d17

Please sign in to comment.