KEYS: Authorise keyctl_set_timeout() on a key if we have its authorisation key
[pandora-kernel.git] / security / keys / keyctl.c
index 6261745..639226a 100644 (file)
@@ -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 */