|
@@ -1091,7 +1091,7 @@ error:
|
|
|
long keyctl_set_timeout(key_serial_t id, unsigned timeout)
|
|
|
{
|
|
|
struct timespec now;
|
|
|
- struct key *key;
|
|
|
+ struct key *key, *instkey;
|
|
|
key_ref_t key_ref;
|
|
|
time_t expiry;
|
|
|
long ret;
|
|
@@ -1099,10 +1099,25 @@ long keyctl_set_timeout(key_serial_t id, unsigned timeout)
|
|
|
key_ref = lookup_user_key(id, KEY_LOOKUP_CREATE | KEY_LOOKUP_PARTIAL,
|
|
|
KEY_SETATTR);
|
|
|
if (IS_ERR(key_ref)) {
|
|
|
+ /* setting the timeout on a key under construction is permitted
|
|
|
+ * if we have the authorisation token handy */
|
|
|
+ if (PTR_ERR(key_ref) == -EACCES) {
|
|
|
+ instkey = key_get_instantiation_authkey(id);
|
|
|
+ if (!IS_ERR(instkey)) {
|
|
|
+ key_put(instkey);
|
|
|
+ key_ref = lookup_user_key(id,
|
|
|
+ KEY_LOOKUP_PARTIAL,
|
|
|
+ 0);
|
|
|
+ if (!IS_ERR(key_ref))
|
|
|
+ goto okay;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
ret = PTR_ERR(key_ref);
|
|
|
goto error;
|
|
|
}
|
|
|
|
|
|
+okay:
|
|
|
key = key_ref_to_ptr(key_ref);
|
|
|
|
|
|
/* make the changes with the locks held to prevent races */
|