*
  * On success returns 0, otherwise -EINVAL.
  */
-static int datablob_parse(char *datablob, struct trusted_key_payload *p)
+static int datablob_parse(char **datablob, struct trusted_key_payload *p)
 {
        substring_t args[MAX_OPT_ARGS];
        long keylen;
        char *c;
 
        /* main command */
-       c = strsep(&datablob, " \t");
+       c = strsep(datablob, " \t");
        if (!c)
                return -EINVAL;
        key_cmd = match_token(c, key_tokens, args);
        switch (key_cmd) {
        case Opt_new:
                /* first argument is key size */
-               c = strsep(&datablob, " \t");
+               c = strsep(datablob, " \t");
                if (!c)
                        return -EINVAL;
                ret = kstrtol(c, 10, &keylen);
                break;
        case Opt_load:
                /* first argument is sealed blob */
-               c = strsep(&datablob, " \t");
+               c = strsep(datablob, " \t");
                if (!c)
                        return -EINVAL;
                p->blob_len = strlen(c) / 2;
 {
        struct trusted_key_payload *payload = NULL;
        size_t datalen = prep->datalen;
-       char *datablob;
+       char *datablob, *orig_datablob;
        int ret = 0;
        int key_cmd;
        size_t key_len;
        if (datalen <= 0 || datalen > 32767 || !prep->data)
                return -EINVAL;
 
-       datablob = kmalloc(datalen + 1, GFP_KERNEL);
+       orig_datablob = datablob = kmalloc(datalen + 1, GFP_KERNEL);
        if (!datablob)
                return -ENOMEM;
        memcpy(datablob, prep->data, datalen);
                goto out;
        }
 
-       key_cmd = datablob_parse(datablob, payload);
+       key_cmd = datablob_parse(&datablob, payload);
        if (key_cmd < 0) {
                ret = key_cmd;
                goto out;
                ret = -EINVAL;
        }
 out:
-       kfree_sensitive(datablob);
+       kfree_sensitive(orig_datablob);
        if (!ret)
                rcu_assign_keypointer(key, payload);
        else
        struct trusted_key_payload *p;
        struct trusted_key_payload *new_p;
        size_t datalen = prep->datalen;
-       char *datablob;
+       char *datablob, *orig_datablob;
        int ret = 0;
 
        if (key_is_negative(key))
        if (datalen <= 0 || datalen > 32767 || !prep->data)
                return -EINVAL;
 
-       datablob = kmalloc(datalen + 1, GFP_KERNEL);
+       orig_datablob = datablob = kmalloc(datalen + 1, GFP_KERNEL);
        if (!datablob)
                return -ENOMEM;
 
 
        memcpy(datablob, prep->data, datalen);
        datablob[datalen] = '\0';
-       ret = datablob_parse(datablob, new_p);
+       ret = datablob_parse(&datablob, new_p);
        if (ret != Opt_update) {
                ret = -EINVAL;
                kfree_sensitive(new_p);
        rcu_assign_keypointer(key, new_p);
        call_rcu(&p->rcu, trusted_rcu_free);
 out:
-       kfree_sensitive(datablob);
+       kfree_sensitive(orig_datablob);
        return ret;
 }