|
@@ -511,26 +511,29 @@ int key_instantiate_and_link(struct key *key,
|
|
EXPORT_SYMBOL(key_instantiate_and_link);
|
|
EXPORT_SYMBOL(key_instantiate_and_link);
|
|
|
|
|
|
/**
|
|
/**
|
|
- * key_negate_and_link - Negatively instantiate a key and link it into the keyring.
|
|
|
|
|
|
+ * key_reject_and_link - Negatively instantiate a key and link it into the keyring.
|
|
* @key: The key to instantiate.
|
|
* @key: The key to instantiate.
|
|
* @timeout: The timeout on the negative key.
|
|
* @timeout: The timeout on the negative key.
|
|
|
|
+ * @error: The error to return when the key is hit.
|
|
* @keyring: Keyring to create a link in on success (or NULL).
|
|
* @keyring: Keyring to create a link in on success (or NULL).
|
|
* @authkey: The authorisation token permitting instantiation.
|
|
* @authkey: The authorisation token permitting instantiation.
|
|
*
|
|
*
|
|
* Negatively instantiate a key that's in the uninstantiated state and, if
|
|
* Negatively instantiate a key that's in the uninstantiated state and, if
|
|
- * successful, set its timeout and link it in to the destination keyring if one
|
|
|
|
- * is supplied. The key and any links to the key will be automatically garbage
|
|
|
|
- * collected after the timeout expires.
|
|
|
|
|
|
+ * successful, set its timeout and stored error and link it in to the
|
|
|
|
+ * destination keyring if one is supplied. The key and any links to the key
|
|
|
|
+ * will be automatically garbage collected after the timeout expires.
|
|
*
|
|
*
|
|
* Negative keys are used to rate limit repeated request_key() calls by causing
|
|
* Negative keys are used to rate limit repeated request_key() calls by causing
|
|
- * them to return -ENOKEY until the negative key expires.
|
|
|
|
|
|
+ * them to return the stored error code (typically ENOKEY) until the negative
|
|
|
|
+ * key expires.
|
|
*
|
|
*
|
|
* If successful, 0 is returned, the authorisation token is revoked and anyone
|
|
* If successful, 0 is returned, the authorisation token is revoked and anyone
|
|
* waiting for the key is woken up. If the key was already instantiated,
|
|
* waiting for the key is woken up. If the key was already instantiated,
|
|
* -EBUSY will be returned.
|
|
* -EBUSY will be returned.
|
|
*/
|
|
*/
|
|
-int key_negate_and_link(struct key *key,
|
|
|
|
|
|
+int key_reject_and_link(struct key *key,
|
|
unsigned timeout,
|
|
unsigned timeout,
|
|
|
|
+ unsigned error,
|
|
struct key *keyring,
|
|
struct key *keyring,
|
|
struct key *authkey)
|
|
struct key *authkey)
|
|
{
|
|
{
|
|
@@ -556,6 +559,7 @@ int key_negate_and_link(struct key *key,
|
|
atomic_inc(&key->user->nikeys);
|
|
atomic_inc(&key->user->nikeys);
|
|
set_bit(KEY_FLAG_NEGATIVE, &key->flags);
|
|
set_bit(KEY_FLAG_NEGATIVE, &key->flags);
|
|
set_bit(KEY_FLAG_INSTANTIATED, &key->flags);
|
|
set_bit(KEY_FLAG_INSTANTIATED, &key->flags);
|
|
|
|
+ key->type_data.reject_error = -error;
|
|
now = current_kernel_time();
|
|
now = current_kernel_time();
|
|
key->expiry = now.tv_sec + timeout;
|
|
key->expiry = now.tv_sec + timeout;
|
|
key_schedule_gc(key->expiry + key_gc_delay);
|
|
key_schedule_gc(key->expiry + key_gc_delay);
|
|
@@ -585,8 +589,7 @@ int key_negate_and_link(struct key *key,
|
|
|
|
|
|
return ret == 0 ? link_ret : ret;
|
|
return ret == 0 ? link_ret : ret;
|
|
}
|
|
}
|
|
-
|
|
|
|
-EXPORT_SYMBOL(key_negate_and_link);
|
|
|
|
|
|
+EXPORT_SYMBOL(key_reject_and_link);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Garbage collect keys in process context so that we don't have to disable
|
|
* Garbage collect keys in process context so that we don't have to disable
|