From: NeilBrown <neilb@suse.de>
To: Chuck Lever <chuck.lever@oracle.com>
Cc: dhowells@redhat.com, linux-nfs@vger.kernel.org
Subject: Re: [PATCH] KEYS: Ensure expired keys are renewed
Date: Thu, 13 Nov 2014 11:15:58 +1100 [thread overview]
Message-ID: <20141113111558.7775022e@notabene.brown> (raw)
In-Reply-To: <20141030174612.10093.61557.stgit@manet.1015granger.net>
[-- Attachment #1: Type: text/plain, Size: 3627 bytes --]
On Thu, 30 Oct 2014 13:46:47 -0400 Chuck Lever <chuck.lever@oracle.com> wrote:
> After about 10 minutes, my NFSv4 functional tests fail because the
> ownership of the test files goes to "-2". Looking at /proc/keys
> shows that the id_resolv keys that map to my test user ID have
> expired. The ownership problem persists until the expired keys are
> purged from the keyring, and fresh keys are obtained.
>
> I bisected the problem to 3.13 commit b2a4df200d57 ("KEYS: Expand
> the capacity of a keyring"). This commit inadvertantly changes the
> API contract of the internal function keyring_search_aux().
>
> The root cause appears to be that b2a4df200d57 made "no state check"
> the default behavior. "No state check" means the keyring search
> iterator function skips checking the key's expiry timeout, and
> returns expired keys. request_key_and_link() depends on getting
> an -EAGAIN result code to know when to perform an upcall to refresh
> an expired key.
>
> Restore the previous default behavior of keyring_search_aux() and
> the meaning of the KEYRING_SEARCH_{DO,NO}_STATE_CHECK flags.
>
> Fixes: b2a4df200d57 ("KEYS: Expand the capacity of a keyring")
> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
> ---
> Resend with correct linux-nfs address.
>
> security/keys/keyring.c | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/security/keys/keyring.c b/security/keys/keyring.c
> index 8314a7d..1294582 100644
> --- a/security/keys/keyring.c
> +++ b/security/keys/keyring.c
> @@ -519,9 +519,14 @@ static int keyring_search_iterator(const void *object, void *iterator_data)
> struct keyring_search_context *ctx = iterator_data;
> const struct key *key = keyring_ptr_to_key(object);
> unsigned long kflags = key->flags;
> + bool state_check_needed;
>
> kenter("{%d}", key->serial);
>
> + state_check_needed = !(ctx->flags & KEYRING_SEARCH_NO_STATE_CHECK);
> + if (ctx->flags & KEYRING_SEARCH_DO_STATE_CHECK)
> + state_check_needed = true;
> +
> /* ignore keys not of this type */
> if (key->type != ctx->index_key.type) {
> kleave(" = 0 [!type]");
> @@ -529,7 +534,7 @@ 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) {
> + if (state_check_needed) {
> if (kflags & ((1 << KEY_FLAG_INVALIDATED) |
> (1 << KEY_FLAG_REVOKED))) {
> ctx->result = ERR_PTR(-EKEYREVOKED);
> @@ -559,7 +564,7 @@ static int keyring_search_iterator(const void *object, void *iterator_data)
> goto skipped;
> }
>
> - if (ctx->flags & KEYRING_SEARCH_DO_STATE_CHECK) {
> + if (state_check_needed) {
> /* we set a different error code if we pass a negative key */
> if (kflags & (1 << KEY_FLAG_NEGATIVE)) {
> smp_rmb();
> @@ -642,8 +647,6 @@ static bool search_nested_keyrings(struct key *keyring,
> }
>
> ctx->skipped_ret = 0;
> - if (ctx->flags & KEYRING_SEARCH_NO_STATE_CHECK)
> - ctx->flags &= ~KEYRING_SEARCH_DO_STATE_CHECK;
>
> /* Start processing a new keyring */
> descend_to_keyring:
>
Reviewed-by: NeilBrown <neilb@suse.de>
security/keys/internal.h says:
#define KEYRING_SEARCH_NO_STATE_CHECK 0x0001 /* Skip state checks */
#define KEYRING_SEARCH_DO_STATE_CHECK 0x0002 /* Override NO_STATE_CHECK */
Your match makes it obvious that DO overrides NO. The current code
doesn't get that right.
Is this on its way upstream yet (not in -next that I could see).
Thanks,
NeilBrown
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 811 bytes --]
next prev parent reply other threads:[~2014-11-13 0:16 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-30 17:46 [PATCH] KEYS: Ensure expired keys are renewed Chuck Lever
2014-11-13 0:15 ` NeilBrown [this message]
2014-11-13 15:09 ` Chuck Lever
2014-11-13 15:29 ` Benjamin Coddington
2014-11-14 12:20 ` David Howells
2014-11-14 15:06 ` Chuck Lever
2014-11-14 14:06 ` [Keyrings] [PATCH 1/3] KEYS: request_key_and_link() needs to request state checks when searching David Howells
2014-11-14 14:06 ` [Keyrings] [PATCH 2/3] KEYS: When searching a keyring, restore KEYRING_SEARCH_DO_STATE_CHECK David Howells
2014-11-14 14:06 ` [Keyrings] [PATCH 3/3] KEYS: KEYRING_SEARCH_NO_STATE_CHECK overrides KEYRING_SEARCH_DO_STATE_CHECK David Howells
2014-11-14 14:49 ` Are both DO_STATE_CHECK and NO_STATE_CHECK required? David Howells
2014-11-14 15:13 ` [Keyrings] " Chuck Lever
2014-11-14 15:18 ` [Keyrings] [PATCH] KEYS: search_nested_keyrings() should honour NO_STATE_CHECK for the root David Howells
2014-11-14 15:19 ` David Howells
2014-11-14 15:39 ` [Keyrings] [PATCH] KEYS: Simplify KEYRING_SEARCH_{NO, DO}_STATE_CHECK flags David Howells
2014-11-17 15:08 ` David Howells
2014-11-17 15:48 ` Chuck Lever
2014-11-18 15:49 ` David Howells
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141113111558.7775022e@notabene.brown \
--to=neilb@suse.de \
--cc=chuck.lever@oracle.com \
--cc=dhowells@redhat.com \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox