Skip to content

Commit

Permalink
Created a function for setting timeouts on keys
Browse files Browse the repository at this point in the history
The keyctl_set_timeout function isn't exported to other parts of the
kernel, but I want to use it for the NFS idmapper.  I already have the
key, but I wanted a generic way to set the timeout.

Signed-off-by: Bryan Schumaker <bjschuma@netapp.com>
Acked-by: David Howells <dhowells@redhat.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
  • Loading branch information
Bryan Schumaker authored and Trond Myklebust committed Mar 1, 2012
1 parent 0cb3284 commit 59e6b9c
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 16 deletions.
2 changes: 2 additions & 0 deletions include/linux/key.h
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,8 @@ static inline key_serial_t key_serial(const struct key *key)
return key ? key->serial : 0;
}

extern void key_set_timeout(struct key *, unsigned);

/**
* key_is_instantiated - Determine if a key has been positively instantiated
* @key: The key to check.
Expand Down
20 changes: 20 additions & 0 deletions security/keys/key.c
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,26 @@ struct key_type *key_type_lookup(const char *type)
return ktype;
}

void key_set_timeout(struct key *key, unsigned timeout)
{
struct timespec now;
time_t expiry = 0;

/* make the changes with the locks held to prevent races */
down_write(&key->sem);

if (timeout > 0) {
now = current_kernel_time();
expiry = now.tv_sec + timeout;
}

key->expiry = expiry;
key_schedule_gc(key->expiry + key_gc_delay);

up_write(&key->sem);
}
EXPORT_SYMBOL_GPL(key_set_timeout);

/*
* Unlock a key type locked by key_type_lookup().
*/
Expand Down
18 changes: 2 additions & 16 deletions security/keys/keyctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/syscalls.h>
#include <linux/key.h>
#include <linux/keyctl.h>
#include <linux/fs.h>
#include <linux/capability.h>
Expand Down Expand Up @@ -1244,10 +1245,8 @@ long keyctl_set_reqkey_keyring(int reqkey_defl)
*/
long keyctl_set_timeout(key_serial_t id, unsigned timeout)
{
struct timespec now;
struct key *key, *instkey;
key_ref_t key_ref;
time_t expiry;
long ret;

key_ref = lookup_user_key(id, KEY_LOOKUP_CREATE | KEY_LOOKUP_PARTIAL,
Expand All @@ -1273,20 +1272,7 @@ long keyctl_set_timeout(key_serial_t id, unsigned timeout)

okay:
key = key_ref_to_ptr(key_ref);

/* make the changes with the locks held to prevent races */
down_write(&key->sem);

expiry = 0;
if (timeout > 0) {
now = current_kernel_time();
expiry = now.tv_sec + timeout;
}

key->expiry = expiry;
key_schedule_gc(key->expiry + key_gc_delay);

up_write(&key->sem);
key_set_timeout(key, timeout);
key_put(key);

ret = 0;
Expand Down

0 comments on commit 59e6b9c

Please sign in to comment.