*
* 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;
}