Skip to content

Commit 218e642

Browse files
committed
keys: Garbage collect keys for which the domain has been removed
If a key operation domain (such as a network namespace) has been removed then attempt to garbage collect all the keys that use it. Signed-off-by: David Howells <[email protected]>
1 parent 3b6e4de commit 218e642

File tree

3 files changed

+19
-1
lines changed

3 files changed

+19
-1
lines changed

include/linux/key.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ extern void key_revoke(struct key *key);
278278
extern void key_invalidate(struct key *key);
279279
extern void key_put(struct key *key);
280280
extern bool key_put_tag(struct key_tag *tag);
281+
extern void key_remove_domain(struct key_tag *domain_tag);
281282

282283
static inline struct key *__key_get(struct key *key)
283284
{
@@ -446,6 +447,7 @@ extern void key_init(void);
446447
#define key_fsgid_changed(c) do { } while(0)
447448
#define key_init() do { } while(0)
448449
#define key_free_user_ns(ns) do { } while(0)
450+
#define key_remove_domain(d) do { } while(0)
449451

450452
#endif /* CONFIG_KEYS */
451453
#endif /* __KERNEL__ */

security/keys/internal.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,8 @@ static inline bool key_is_dead(const struct key *key, time64_t limit)
209209
return
210210
key->flags & ((1 << KEY_FLAG_DEAD) |
211211
(1 << KEY_FLAG_INVALIDATED)) ||
212-
(key->expiry > 0 && key->expiry <= limit);
212+
(key->expiry > 0 && key->expiry <= limit) ||
213+
key->domain_tag->removed;
213214
}
214215

215216
/*

security/keys/keyring.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,21 @@ bool key_put_tag(struct key_tag *tag)
241241
return false;
242242
}
243243

244+
/**
245+
* key_remove_domain - Kill off a key domain and gc its keys
246+
* @domain_tag: The domain tag to release.
247+
*
248+
* This marks a domain tag as being dead and releases a ref on it. If that
249+
* wasn't the last reference, the garbage collector is poked to try and delete
250+
* all keys that were in the domain.
251+
*/
252+
void key_remove_domain(struct key_tag *domain_tag)
253+
{
254+
domain_tag->removed = true;
255+
if (!key_put_tag(domain_tag))
256+
key_schedule_gc_links();
257+
}
258+
244259
/*
245260
* Build the next index key chunk.
246261
*

0 commit comments

Comments
 (0)