diff options
author | David Howells <dhowells@redhat.com> | 2014-07-18 18:56:34 +0100 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2014-07-22 21:46:12 +0100 |
commit | 4d8c0250b841159b128785f7a7efbaff40cc8501 (patch) | |
tree | 88860f5296ab855ba75588a0ec3e9fce73b7def3 | |
parent | 7dfa0ca6a95de65b7a7760630cdbd7d30f204bfa (diff) | |
download | op-kernel-dev-4d8c0250b841159b128785f7a7efbaff40cc8501.zip op-kernel-dev-4d8c0250b841159b128785f7a7efbaff40cc8501.tar.gz |
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>
-rw-r--r-- | Documentation/security/keys.txt | 4 | ||||
-rw-r--r-- | security/keys/key.c | 9 |
2 files changed, 7 insertions, 6 deletions
diff --git a/Documentation/security/keys.txt b/Documentation/security/keys.txt index 315cf96..8727c19 100644 --- a/Documentation/security/keys.txt +++ b/Documentation/security/keys.txt @@ -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, otherwise it is unused. It cleans up anything attached to the 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); diff --git a/security/keys/key.c b/security/keys/key.c index 755fb02..b90a68c 100644 --- a/security/keys/key.c +++ b/security/keys/key.c @@ -494,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); @@ -502,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; } @@ -822,7 +821,7 @@ key_ref_t key_create_or_update(key_ref_t keyring_ref, 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; @@ -964,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); |