diff options
Diffstat (limited to 'security/keys/key.c')
-rw-r--r-- | security/keys/key.c | 51 |
1 files changed, 4 insertions, 47 deletions
diff --git a/security/keys/key.c b/security/keys/key.c index 1f3ed44a83c0..4414abddcb5b 100644 --- a/security/keys/key.c +++ b/security/keys/key.c | |||
@@ -39,11 +39,6 @@ static DECLARE_RWSEM(key_types_sem); | |||
39 | /* We serialise key instantiation and link */ | 39 | /* We serialise key instantiation and link */ |
40 | DEFINE_MUTEX(key_construction_mutex); | 40 | DEFINE_MUTEX(key_construction_mutex); |
41 | 41 | ||
42 | /* Any key who's type gets unegistered will be re-typed to this */ | ||
43 | static struct key_type key_type_dead = { | ||
44 | .name = "dead", | ||
45 | }; | ||
46 | |||
47 | #ifdef KEY_DEBUGGING | 42 | #ifdef KEY_DEBUGGING |
48 | void __key_check(const struct key *key) | 43 | void __key_check(const struct key *key) |
49 | { | 44 | { |
@@ -602,7 +597,7 @@ void key_put(struct key *key) | |||
602 | key_check(key); | 597 | key_check(key); |
603 | 598 | ||
604 | if (atomic_dec_and_test(&key->usage)) | 599 | if (atomic_dec_and_test(&key->usage)) |
605 | queue_work(system_nrt_wq, &key_gc_unused_work); | 600 | queue_work(system_nrt_wq, &key_gc_work); |
606 | } | 601 | } |
607 | } | 602 | } |
608 | EXPORT_SYMBOL(key_put); | 603 | EXPORT_SYMBOL(key_put); |
@@ -980,49 +975,11 @@ EXPORT_SYMBOL(register_key_type); | |||
980 | */ | 975 | */ |
981 | void unregister_key_type(struct key_type *ktype) | 976 | void unregister_key_type(struct key_type *ktype) |
982 | { | 977 | { |
983 | struct rb_node *_n; | ||
984 | struct key *key; | ||
985 | |||
986 | down_write(&key_types_sem); | 978 | down_write(&key_types_sem); |
987 | |||
988 | /* withdraw the key type */ | ||
989 | list_del_init(&ktype->link); | 979 | list_del_init(&ktype->link); |
990 | 980 | downgrade_write(&key_types_sem); | |
991 | /* mark all the keys of this type dead */ | 981 | key_gc_keytype(ktype); |
992 | spin_lock(&key_serial_lock); | 982 | up_read(&key_types_sem); |
993 | |||
994 | for (_n = rb_first(&key_serial_tree); _n; _n = rb_next(_n)) { | ||
995 | key = rb_entry(_n, struct key, serial_node); | ||
996 | |||
997 | if (key->type == ktype) { | ||
998 | key->type = &key_type_dead; | ||
999 | set_bit(KEY_FLAG_DEAD, &key->flags); | ||
1000 | } | ||
1001 | } | ||
1002 | |||
1003 | spin_unlock(&key_serial_lock); | ||
1004 | |||
1005 | /* make sure everyone revalidates their keys */ | ||
1006 | synchronize_rcu(); | ||
1007 | |||
1008 | /* we should now be able to destroy the payloads of all the keys of | ||
1009 | * this type with impunity */ | ||
1010 | spin_lock(&key_serial_lock); | ||
1011 | |||
1012 | for (_n = rb_first(&key_serial_tree); _n; _n = rb_next(_n)) { | ||
1013 | key = rb_entry(_n, struct key, serial_node); | ||
1014 | |||
1015 | if (key->type == ktype) { | ||
1016 | if (ktype->destroy) | ||
1017 | ktype->destroy(key); | ||
1018 | memset(&key->payload, KEY_DESTROY, sizeof(key->payload)); | ||
1019 | } | ||
1020 | } | ||
1021 | |||
1022 | spin_unlock(&key_serial_lock); | ||
1023 | up_write(&key_types_sem); | ||
1024 | |||
1025 | key_schedule_gc(0); | ||
1026 | } | 983 | } |
1027 | EXPORT_SYMBOL(unregister_key_type); | 984 | EXPORT_SYMBOL(unregister_key_type); |
1028 | 985 | ||