diff options
Diffstat (limited to 'security/keys/keyctl.c')
-rw-r--r-- | security/keys/keyctl.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c index 365ff85d7e27..76d22f726ae4 100644 --- a/security/keys/keyctl.c +++ b/security/keys/keyctl.c | |||
@@ -766,10 +766,9 @@ long keyctl_read_key(key_serial_t keyid, char __user *buffer, size_t buflen) | |||
766 | 766 | ||
767 | key = key_ref_to_ptr(key_ref); | 767 | key = key_ref_to_ptr(key_ref); |
768 | 768 | ||
769 | if (test_bit(KEY_FLAG_NEGATIVE, &key->flags)) { | 769 | ret = key_read_state(key); |
770 | ret = -ENOKEY; | 770 | if (ret < 0) |
771 | goto error2; | 771 | goto error2; /* Negatively instantiated */ |
772 | } | ||
773 | 772 | ||
774 | /* see if we can read it directly */ | 773 | /* see if we can read it directly */ |
775 | ret = key_permission(key_ref, KEY_NEED_READ); | 774 | ret = key_permission(key_ref, KEY_NEED_READ); |
@@ -901,7 +900,7 @@ long keyctl_chown_key(key_serial_t id, uid_t user, gid_t group) | |||
901 | atomic_dec(&key->user->nkeys); | 900 | atomic_dec(&key->user->nkeys); |
902 | atomic_inc(&newowner->nkeys); | 901 | atomic_inc(&newowner->nkeys); |
903 | 902 | ||
904 | if (test_bit(KEY_FLAG_INSTANTIATED, &key->flags)) { | 903 | if (key->state != KEY_IS_UNINSTANTIATED) { |
905 | atomic_dec(&key->user->nikeys); | 904 | atomic_dec(&key->user->nikeys); |
906 | atomic_inc(&newowner->nikeys); | 905 | atomic_inc(&newowner->nikeys); |
907 | } | 906 | } |