KEYS: Call ->free_preparse() even after ->preparse() returns an error
Call the ->free_preparse() key type op even after ->preparse() returns an error as it does cleaning up type stuff. Signed-off-by: David Howells <dhowells@redhat.com> Acked-by: Steve Dickson <steved@redhat.com> Acked-by: Jeff Layton <jlayton@primarydata.com> Reviewed-by: Sage Weil <sage@redhat.com>
This commit is contained in:
parent
7dfa0ca6a9
commit
4d8c0250b8
@ -1176,7 +1176,9 @@ The structure has a number of fields, some of which are mandatory:
|
|||||||
This method is only required if the preparse() method is provided,
|
This method is only required if the preparse() method is provided,
|
||||||
otherwise it is unused. It cleans up anything attached to the
|
otherwise it is unused. It cleans up anything attached to the
|
||||||
description, type_data and payload fields of the key_preparsed_payload
|
description, type_data and payload fields of the key_preparsed_payload
|
||||||
struct as filled in by the preparse() method.
|
struct as filled in by the preparse() method. It will always be called
|
||||||
|
after preparse() returns successfully, even if instantiate() or update()
|
||||||
|
succeed.
|
||||||
|
|
||||||
|
|
||||||
(*) int (*instantiate)(struct key *key, struct key_preparsed_payload *prep);
|
(*) int (*instantiate)(struct key *key, struct key_preparsed_payload *prep);
|
||||||
|
@ -494,7 +494,7 @@ int key_instantiate_and_link(struct key *key,
|
|||||||
if (keyring) {
|
if (keyring) {
|
||||||
ret = __key_link_begin(keyring, &key->index_key, &edit);
|
ret = __key_link_begin(keyring, &key->index_key, &edit);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error_free_preparse;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = __key_instantiate_and_link(key, &prep, keyring, authkey, &edit);
|
ret = __key_instantiate_and_link(key, &prep, keyring, authkey, &edit);
|
||||||
@ -502,10 +502,9 @@ int key_instantiate_and_link(struct key *key,
|
|||||||
if (keyring)
|
if (keyring)
|
||||||
__key_link_end(keyring, &key->index_key, edit);
|
__key_link_end(keyring, &key->index_key, edit);
|
||||||
|
|
||||||
error_free_preparse:
|
error:
|
||||||
if (key->type->preparse)
|
if (key->type->preparse)
|
||||||
key->type->free_preparse(&prep);
|
key->type->free_preparse(&prep);
|
||||||
error:
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -822,7 +821,7 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref,
|
|||||||
ret = index_key.type->preparse(&prep);
|
ret = index_key.type->preparse(&prep);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
key_ref = ERR_PTR(ret);
|
key_ref = ERR_PTR(ret);
|
||||||
goto error_put_type;
|
goto error_free_prep;
|
||||||
}
|
}
|
||||||
if (!index_key.description)
|
if (!index_key.description)
|
||||||
index_key.description = prep.description;
|
index_key.description = prep.description;
|
||||||
@ -964,9 +963,9 @@ int key_update(key_ref_t key_ref, const void *payload, size_t plen)
|
|||||||
|
|
||||||
up_write(&key->sem);
|
up_write(&key->sem);
|
||||||
|
|
||||||
|
error:
|
||||||
if (key->type->preparse)
|
if (key->type->preparse)
|
||||||
key->type->free_preparse(&prep);
|
key->type->free_preparse(&prep);
|
||||||
error:
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(key_update);
|
EXPORT_SYMBOL(key_update);
|
||||||
|
Loading…
Reference in New Issue
Block a user