Skip to content

Commit

Permalink
KEYS: Don't check for NULL key pointer in key_validate()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
David Howells authored and James Morris committed May 15, 2012
1 parent 2cc8a71 commit b404aef
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 25 deletions.
2 changes: 1 addition & 1 deletion include/linux/key.h
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ extern struct key *request_key_async_with_auxdata(struct key_type *type,

extern int wait_for_key_construction(struct key *key, bool intr);

extern int key_validate(struct key *key);
extern int key_validate(const struct key *key);

extern key_ref_t key_create_or_update(key_ref_t keyring,
const char *type,
Expand Down
40 changes: 16 additions & 24 deletions security/keys/permission.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,33 +91,25 @@ EXPORT_SYMBOL(key_task_permission);
* key is invalidated, -EKEYREVOKED if the key's type has been removed or if
* the key has been revoked or -EKEYEXPIRED if the key has expired.
*/
int key_validate(struct key *key)
int key_validate(const struct key *key)
{
struct timespec now;
unsigned long flags = key->flags;
int ret = 0;

if (key) {
ret = -ENOKEY;
if (flags & (1 << KEY_FLAG_INVALIDATED))
goto error;

/* check it's still accessible */
ret = -EKEYREVOKED;
if (flags & ((1 << KEY_FLAG_REVOKED) |
(1 << KEY_FLAG_DEAD)))
goto error;

/* check it hasn't expired */
ret = 0;
if (key->expiry) {
now = current_kernel_time();
if (now.tv_sec >= key->expiry)
ret = -EKEYEXPIRED;
}

if (flags & (1 << KEY_FLAG_INVALIDATED))
return -ENOKEY;

/* check it's still accessible */
if (flags & ((1 << KEY_FLAG_REVOKED) |
(1 << KEY_FLAG_DEAD)))
return -EKEYREVOKED;

/* check it hasn't expired */
if (key->expiry) {
struct timespec now = current_kernel_time();
if (now.tv_sec >= key->expiry)
return -EKEYEXPIRED;
}

error:
return ret;
return 0;
}
EXPORT_SYMBOL(key_validate);

0 comments on commit b404aef

Please sign in to comment.