Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[cascardo/linux.git] / security / keys / key.c
index 2048a11..b90a68c 100644 (file)
@@ -437,6 +437,11 @@ static int __key_instantiate_and_link(struct key *key,
                        /* disable the authorisation key */
                        if (authkey)
                                key_revoke(authkey);
+
+                       if (prep->expiry != TIME_T_MAX) {
+                               key->expiry = prep->expiry;
+                               key_schedule_gc(prep->expiry + key_gc_delay);
+                       }
                }
        }
 
@@ -479,6 +484,7 @@ int key_instantiate_and_link(struct key *key,
        prep.data = data;
        prep.datalen = datalen;
        prep.quotalen = key->type->def_datalen;
+       prep.expiry = TIME_T_MAX;
        if (key->type->preparse) {
                ret = key->type->preparse(&prep);
                if (ret < 0)
@@ -488,7 +494,7 @@ int key_instantiate_and_link(struct key *key,
        if (keyring) {
                ret = __key_link_begin(keyring, &key->index_key, &edit);
                if (ret < 0)
-                       goto error_free_preparse;
+                       goto error;
        }
 
        ret = __key_instantiate_and_link(key, &prep, keyring, authkey, &edit);
@@ -496,10 +502,9 @@ int key_instantiate_and_link(struct key *key,
        if (keyring)
                __key_link_end(keyring, &key->index_key, edit);
 
-error_free_preparse:
+error:
        if (key->type->preparse)
                key->type->free_preparse(&prep);
-error:
        return ret;
 }
 
@@ -811,11 +816,12 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref,
        prep.datalen = plen;
        prep.quotalen = index_key.type->def_datalen;
        prep.trusted = flags & KEY_ALLOC_TRUSTED;
+       prep.expiry = TIME_T_MAX;
        if (index_key.type->preparse) {
                ret = index_key.type->preparse(&prep);
                if (ret < 0) {
                        key_ref = ERR_PTR(ret);
-                       goto error_put_type;
+                       goto error_free_prep;
                }
                if (!index_key.description)
                        index_key.description = prep.description;
@@ -941,6 +947,7 @@ int key_update(key_ref_t key_ref, const void *payload, size_t plen)
        prep.data = payload;
        prep.datalen = plen;
        prep.quotalen = key->type->def_datalen;
+       prep.expiry = TIME_T_MAX;
        if (key->type->preparse) {
                ret = key->type->preparse(&prep);
                if (ret < 0)
@@ -956,9 +963,9 @@ int key_update(key_ref_t key_ref, const void *payload, size_t plen)
 
        up_write(&key->sem);
 
+error:
        if (key->type->preparse)
                key->type->free_preparse(&prep);
-error:
        return ret;
 }
 EXPORT_SYMBOL(key_update);
@@ -1023,6 +1030,38 @@ void key_invalidate(struct key *key)
 }
 EXPORT_SYMBOL(key_invalidate);
 
+/**
+ * generic_key_instantiate - Simple instantiation of a key from preparsed data
+ * @key: The key to be instantiated
+ * @prep: The preparsed data to load.
+ *
+ * Instantiate a key from preparsed data.  We assume we can just copy the data
+ * in directly and clear the old pointers.
+ *
+ * This can be pointed to directly by the key type instantiate op pointer.
+ */
+int generic_key_instantiate(struct key *key, struct key_preparsed_payload *prep)
+{
+       int ret;
+
+       pr_devel("==>%s()\n", __func__);
+
+       ret = key_payload_reserve(key, prep->quotalen);
+       if (ret == 0) {
+               key->type_data.p[0] = prep->type_data[0];
+               key->type_data.p[1] = prep->type_data[1];
+               rcu_assign_keypointer(key, prep->payload[0]);
+               key->payload.data2[1] = prep->payload[1];
+               prep->type_data[0] = NULL;
+               prep->type_data[1] = NULL;
+               prep->payload[0] = NULL;
+               prep->payload[1] = NULL;
+       }
+       pr_devel("<==%s() = %d\n", __func__, ret);
+       return ret;
+}
+EXPORT_SYMBOL(generic_key_instantiate);
+
 /**
  * register_key_type - Register a type of key.
  * @ktype: The new key type.