KEYS: Add garbage collection for dead, revoked and expired keys. [try #6]
Add garbage collection for dead, revoked and expired keys. This involved erasing all links to such keys from keyrings that point to them. At that point, the key will be deleted in the normal manner. Keyrings from which garbage collection occurs are shrunk and their quota consumption reduced as appropriate. Dead keys (for which the key type has been removed) will be garbage collected immediately. Revoked and expired keys will hang around for a number of seconds, as set in /proc/sys/kernel/keys/gc_delay before being automatically removed. The default is 5 minutes. Signed-off-by: David Howells <dhowells@redhat.com> Signed-off-by: James Morris <jmorris@namei.org>
This commit is contained in:

committed by
James Morris

parent
f041ae2f99
commit
5d135440fa
@@ -500,6 +500,7 @@ int key_negate_and_link(struct key *key,
|
||||
set_bit(KEY_FLAG_INSTANTIATED, &key->flags);
|
||||
now = current_kernel_time();
|
||||
key->expiry = now.tv_sec + timeout;
|
||||
key_schedule_gc(key->expiry);
|
||||
|
||||
if (test_and_clear_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags))
|
||||
awaken = 1;
|
||||
@@ -888,6 +889,9 @@ EXPORT_SYMBOL(key_update);
|
||||
*/
|
||||
void key_revoke(struct key *key)
|
||||
{
|
||||
struct timespec now;
|
||||
time_t time;
|
||||
|
||||
key_check(key);
|
||||
|
||||
/* make sure no one's trying to change or use the key when we mark it
|
||||
@@ -900,6 +904,14 @@ void key_revoke(struct key *key)
|
||||
key->type->revoke)
|
||||
key->type->revoke(key);
|
||||
|
||||
/* set the death time to no more than the expiry time */
|
||||
now = current_kernel_time();
|
||||
time = now.tv_sec;
|
||||
if (key->revoked_at == 0 || key->revoked_at > time) {
|
||||
key->revoked_at = time;
|
||||
key_schedule_gc(key->revoked_at);
|
||||
}
|
||||
|
||||
up_write(&key->sem);
|
||||
|
||||
} /* end key_revoke() */
|
||||
@@ -984,6 +996,8 @@ void unregister_key_type(struct key_type *ktype)
|
||||
spin_unlock(&key_serial_lock);
|
||||
up_write(&key_types_sem);
|
||||
|
||||
key_schedule_gc(0);
|
||||
|
||||
} /* end unregister_key_type() */
|
||||
|
||||
EXPORT_SYMBOL(unregister_key_type);
|
||||
|
Reference in New Issue
Block a user