diff options
author | Eric Biggers <ebiggers@google.com> | 2017-09-27 22:50:45 +0300 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2017-10-18 11:12:41 +0300 |
commit | 9d6c8711b6a751a694bcfaf49fb557b82092ee46 (patch) | |
tree | dc8b395982b19ceae03b85dbdf34e7388a6828fa /security/keys | |
parent | 1823d475a5eeaa0f52789b1b7e2d31a592ae92ea (diff) | |
download | linux-9d6c8711b6a751a694bcfaf49fb557b82092ee46.tar.xz |
KEYS: Load key expiry time atomically in keyring_search_iterator()
Similar to the case for key_validate(), we should load the key ->expiry
once atomically in keyring_search_iterator(), since it can be changed
concurrently with the flags whenever the key semaphore isn't held.
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Diffstat (limited to 'security/keys')
-rw-r--r-- | security/keys/keyring.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/security/keys/keyring.c b/security/keys/keyring.c index 06173b091a74..a7e51f793867 100644 --- a/security/keys/keyring.c +++ b/security/keys/keyring.c @@ -566,6 +566,8 @@ static int keyring_search_iterator(const void *object, void *iterator_data) /* skip invalidated, revoked and expired keys */ if (ctx->flags & KEYRING_SEARCH_DO_STATE_CHECK) { + time_t expiry = READ_ONCE(key->expiry); + if (kflags & ((1 << KEY_FLAG_INVALIDATED) | (1 << KEY_FLAG_REVOKED))) { ctx->result = ERR_PTR(-EKEYREVOKED); @@ -573,7 +575,7 @@ static int keyring_search_iterator(const void *object, void *iterator_data) goto skipped; } - if (key->expiry && ctx->now.tv_sec >= key->expiry) { + if (expiry && ctx->now.tv_sec >= expiry) { if (!(ctx->flags & KEYRING_SEARCH_SKIP_EXPIRED)) ctx->result = ERR_PTR(-EKEYEXPIRED); kleave(" = %d [expire]", ctx->skipped_ret); |