diff options
Diffstat (limited to 'security/keys/gc.c')
-rw-r--r-- | security/keys/gc.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/security/keys/gc.c b/security/keys/gc.c index 87cb260e4890..f01d48cb3de1 100644 --- a/security/keys/gc.c +++ b/security/keys/gc.c | |||
@@ -129,15 +129,15 @@ static noinline void key_gc_unused_keys(struct list_head *keys) | |||
129 | while (!list_empty(keys)) { | 129 | while (!list_empty(keys)) { |
130 | struct key *key = | 130 | struct key *key = |
131 | list_entry(keys->next, struct key, graveyard_link); | 131 | list_entry(keys->next, struct key, graveyard_link); |
132 | short state = key->state; | ||
133 | |||
132 | list_del(&key->graveyard_link); | 134 | list_del(&key->graveyard_link); |
133 | 135 | ||
134 | kdebug("- %u", key->serial); | 136 | kdebug("- %u", key->serial); |
135 | key_check(key); | 137 | key_check(key); |
136 | 138 | ||
137 | /* Throw away the key data if the key is instantiated */ | 139 | /* Throw away the key data if the key is instantiated */ |
138 | if (test_bit(KEY_FLAG_INSTANTIATED, &key->flags) && | 140 | if (state == KEY_IS_POSITIVE && key->type->destroy) |
139 | !test_bit(KEY_FLAG_NEGATIVE, &key->flags) && | ||
140 | key->type->destroy) | ||
141 | key->type->destroy(key); | 141 | key->type->destroy(key); |
142 | 142 | ||
143 | security_key_free(key); | 143 | security_key_free(key); |
@@ -151,7 +151,7 @@ static noinline void key_gc_unused_keys(struct list_head *keys) | |||
151 | } | 151 | } |
152 | 152 | ||
153 | atomic_dec(&key->user->nkeys); | 153 | atomic_dec(&key->user->nkeys); |
154 | if (test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) | 154 | if (state != KEY_IS_UNINSTANTIATED) |
155 | atomic_dec(&key->user->nikeys); | 155 | atomic_dec(&key->user->nikeys); |
156 | 156 | ||
157 | key_user_put(key->user); | 157 | key_user_put(key->user); |