aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2012-05-15 09:11:11 -0400
committerJames Morris <james.l.morris@oracle.com>2012-05-15 10:54:33 -0400
commitb404aef72fdafb601c945c714164c0ee2b04c364 (patch)
tree46efed0307e7c208a254614361bbe08ed160ef52
parent2cc8a71641b4460783ea3bd7a3476043fdf85397 (diff)
KEYS: Don't check for NULL key pointer in key_validate()
Don't bother checking for NULL key pointer in key_validate() as all of the places that call it will crash anyway if the relevant key pointer is NULL by the time they call key_validate(). Therefore, the checking must be done prior to calling here. Whilst we're at it, simplify the key_validate() function a bit and mark its argument const. Reported-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: David Howells <dhowells@redhat.com> cc: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: James Morris <james.l.morris@oracle.com>
-rw-r--r--include/linux/key.h2
-rw-r--r--security/keys/permission.c40
2 files changed, 17 insertions, 25 deletions
diff --git a/include/linux/key.h b/include/linux/key.h
index b145b054b3e0..5231800770e1 100644
--- a/include/linux/key.h
+++ b/include/linux/key.h
@@ -242,7 +242,7 @@ extern struct key *request_key_async_with_auxdata(struct key_type *type,
242 242
243extern int wait_for_key_construction(struct key *key, bool intr); 243extern int wait_for_key_construction(struct key *key, bool intr);
244 244
245extern int key_validate(struct key *key); 245extern int key_validate(const struct key *key);
246 246
247extern key_ref_t key_create_or_update(key_ref_t keyring, 247extern key_ref_t key_create_or_update(key_ref_t keyring,
248 const char *type, 248 const char *type,
diff --git a/security/keys/permission.c b/security/keys/permission.c
index 5f4c00c0947d..57d96363d7f1 100644
--- a/security/keys/permission.c
+++ b/security/keys/permission.c
@@ -91,33 +91,25 @@ EXPORT_SYMBOL(key_task_permission);
91 * key is invalidated, -EKEYREVOKED if the key's type has been removed or if 91 * key is invalidated, -EKEYREVOKED if the key's type has been removed or if
92 * the key has been revoked or -EKEYEXPIRED if the key has expired. 92 * the key has been revoked or -EKEYEXPIRED if the key has expired.
93 */ 93 */
94int key_validate(struct key *key) 94int key_validate(const struct key *key)
95{ 95{
96 struct timespec now;
97 unsigned long flags = key->flags; 96 unsigned long flags = key->flags;
98 int ret = 0; 97
99 98 if (flags & (1 << KEY_FLAG_INVALIDATED))
100 if (key) { 99 return -ENOKEY;
101 ret = -ENOKEY; 100
102 if (flags & (1 << KEY_FLAG_INVALIDATED)) 101 /* check it's still accessible */
103 goto error; 102 if (flags & ((1 << KEY_FLAG_REVOKED) |
104 103 (1 << KEY_FLAG_DEAD)))
105 /* check it's still accessible */ 104 return -EKEYREVOKED;
106 ret = -EKEYREVOKED; 105
107 if (flags & ((1 << KEY_FLAG_REVOKED) | 106 /* check it hasn't expired */
108 (1 << KEY_FLAG_DEAD))) 107 if (key->expiry) {
109 goto error; 108 struct timespec now = current_kernel_time();
110 109 if (now.tv_sec >= key->expiry)
111 /* check it hasn't expired */ 110 return -EKEYEXPIRED;
112 ret = 0;
113 if (key->expiry) {
114 now = current_kernel_time();
115 if (now.tv_sec >= key->expiry)
116 ret = -EKEYEXPIRED;
117 }
118 } 111 }
119 112
120error: 113 return 0;
121 return ret;
122} 114}
123EXPORT_SYMBOL(key_validate); 115EXPORT_SYMBOL(key_validate);