crypto: algapi - make unregistration functions return void

Some of the algorithm unregistration functions return -ENOENT when asked
to unregister a non-registered algorithm, while others always return 0
or always return void.  But no users check the return value, except for
two of the bulk unregistration functions which print a message on error
but still always return 0 to their caller, and crypto_del_alg() which
calls crypto_unregister_instance() which always returns 0.

Since unregistering a non-registered algorithm is always a kernel bug
but there isn't anything callers should do to handle this situation at
runtime, let's simplify things by making all the unregistration
functions return void, and moving the error message into
crypto_unregister_alg() and upgrading it to a WARN().

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Eric Biggers 2019-12-15 15:51:19 -08:00 committed by Herbert Xu
parent 0e89640b64
commit c6d633a927
12 changed files with 42 additions and 71 deletions

View File

@ -31,28 +31,18 @@ The counterparts to those functions are listed below.
:: ::
int crypto_unregister_alg(struct crypto_alg *alg); void crypto_unregister_alg(struct crypto_alg *alg);
int crypto_unregister_algs(struct crypto_alg *algs, int count); void crypto_unregister_algs(struct crypto_alg *algs, int count);
Notice that both registration and unregistration functions do return a The registration functions return 0 on success, or a negative errno
value, so make sure to handle errors. A return code of zero implies value on failure. crypto_register_algs() succeeds only if it
success. Any return code < 0 implies an error. successfully registered all the given algorithms; if it fails partway
through, then any changes are rolled back.
The bulk registration/unregistration functions register/unregister each The unregistration functions always succeed, so they don't have a
transformation in the given array of length count. They handle errors as return value. Don't try to unregister algorithms that aren't
follows: currently registered.
- crypto_register_algs() succeeds if and only if it successfully
registers all the given transformations. If an error occurs partway
through, then it rolls back successful registrations before returning
the error code. Note that if a driver needs to handle registration
errors for individual transformations, then it will need to use the
non-bulk function crypto_register_alg() instead.
- crypto_unregister_algs() tries to unregister all the given
transformations, continuing on error. It logs errors and always
returns zero.
Single-Block Symmetric Ciphers [CIPHER] Single-Block Symmetric Ciphers [CIPHER]
--------------------------------------- ---------------------------------------
@ -169,10 +159,10 @@ are as follows:
:: ::
int crypto_unregister_ahash(struct ahash_alg *alg); void crypto_unregister_ahash(struct ahash_alg *alg);
int crypto_unregister_shash(struct shash_alg *alg); void crypto_unregister_shash(struct shash_alg *alg);
int crypto_unregister_shashes(struct shash_alg *algs, int count); void crypto_unregister_shashes(struct shash_alg *algs, int count);
Cipher Definition With struct shash_alg and ahash_alg Cipher Definition With struct shash_alg and ahash_alg

View File

@ -151,9 +151,9 @@ int crypto_register_acomp(struct acomp_alg *alg)
} }
EXPORT_SYMBOL_GPL(crypto_register_acomp); EXPORT_SYMBOL_GPL(crypto_register_acomp);
int crypto_unregister_acomp(struct acomp_alg *alg) void crypto_unregister_acomp(struct acomp_alg *alg)
{ {
return crypto_unregister_alg(&alg->base); crypto_unregister_alg(&alg->base);
} }
EXPORT_SYMBOL_GPL(crypto_unregister_acomp); EXPORT_SYMBOL_GPL(crypto_unregister_acomp);

View File

@ -598,9 +598,9 @@ int crypto_register_ahash(struct ahash_alg *alg)
} }
EXPORT_SYMBOL_GPL(crypto_register_ahash); EXPORT_SYMBOL_GPL(crypto_register_ahash);
int crypto_unregister_ahash(struct ahash_alg *alg) void crypto_unregister_ahash(struct ahash_alg *alg)
{ {
return crypto_unregister_alg(&alg->halg.base); crypto_unregister_alg(&alg->halg.base);
} }
EXPORT_SYMBOL_GPL(crypto_unregister_ahash); EXPORT_SYMBOL_GPL(crypto_unregister_ahash);

View File

@ -442,7 +442,7 @@ static int crypto_remove_alg(struct crypto_alg *alg, struct list_head *list)
return 0; return 0;
} }
int crypto_unregister_alg(struct crypto_alg *alg) void crypto_unregister_alg(struct crypto_alg *alg)
{ {
int ret; int ret;
LIST_HEAD(list); LIST_HEAD(list);
@ -451,15 +451,14 @@ int crypto_unregister_alg(struct crypto_alg *alg)
ret = crypto_remove_alg(alg, &list); ret = crypto_remove_alg(alg, &list);
up_write(&crypto_alg_sem); up_write(&crypto_alg_sem);
if (ret) if (WARN(ret, "Algorithm %s is not registered", alg->cra_driver_name))
return ret; return;
BUG_ON(refcount_read(&alg->cra_refcnt) != 1); BUG_ON(refcount_read(&alg->cra_refcnt) != 1);
if (alg->cra_destroy) if (alg->cra_destroy)
alg->cra_destroy(alg); alg->cra_destroy(alg);
crypto_remove_final(&list); crypto_remove_final(&list);
return 0;
} }
EXPORT_SYMBOL_GPL(crypto_unregister_alg); EXPORT_SYMBOL_GPL(crypto_unregister_alg);
@ -483,18 +482,12 @@ err:
} }
EXPORT_SYMBOL_GPL(crypto_register_algs); EXPORT_SYMBOL_GPL(crypto_register_algs);
int crypto_unregister_algs(struct crypto_alg *algs, int count) void crypto_unregister_algs(struct crypto_alg *algs, int count)
{ {
int i, ret; int i;
for (i = 0; i < count; i++) { for (i = 0; i < count; i++)
ret = crypto_unregister_alg(&algs[i]); crypto_unregister_alg(&algs[i]);
if (ret)
pr_err("Failed to unregister %s %s: %d\n",
algs[i].cra_driver_name, algs[i].cra_name, ret);
}
return 0;
} }
EXPORT_SYMBOL_GPL(crypto_unregister_algs); EXPORT_SYMBOL_GPL(crypto_unregister_algs);
@ -639,7 +632,7 @@ err:
} }
EXPORT_SYMBOL_GPL(crypto_register_instance); EXPORT_SYMBOL_GPL(crypto_register_instance);
int crypto_unregister_instance(struct crypto_instance *inst) void crypto_unregister_instance(struct crypto_instance *inst)
{ {
LIST_HEAD(list); LIST_HEAD(list);
@ -651,8 +644,6 @@ int crypto_unregister_instance(struct crypto_instance *inst)
up_write(&crypto_alg_sem); up_write(&crypto_alg_sem);
crypto_remove_final(&list); crypto_remove_final(&list);
return 0;
} }
EXPORT_SYMBOL_GPL(crypto_unregister_instance); EXPORT_SYMBOL_GPL(crypto_unregister_instance);

View File

@ -323,7 +323,8 @@ static int crypto_del_alg(struct sk_buff *skb, struct nlmsghdr *nlh,
if (refcount_read(&alg->cra_refcnt) > 2) if (refcount_read(&alg->cra_refcnt) > 2)
goto drop_alg; goto drop_alg;
err = crypto_unregister_instance((struct crypto_instance *)alg); crypto_unregister_instance((struct crypto_instance *)alg);
err = 0;
drop_alg: drop_alg:
crypto_mod_put(alg); crypto_mod_put(alg);

View File

@ -266,9 +266,9 @@ int crypto_register_scomp(struct scomp_alg *alg)
} }
EXPORT_SYMBOL_GPL(crypto_register_scomp); EXPORT_SYMBOL_GPL(crypto_register_scomp);
int crypto_unregister_scomp(struct scomp_alg *alg) void crypto_unregister_scomp(struct scomp_alg *alg)
{ {
return crypto_unregister_alg(&alg->base); crypto_unregister_alg(&alg->base);
} }
EXPORT_SYMBOL_GPL(crypto_unregister_scomp); EXPORT_SYMBOL_GPL(crypto_unregister_scomp);

View File

@ -520,9 +520,9 @@ int crypto_register_shash(struct shash_alg *alg)
} }
EXPORT_SYMBOL_GPL(crypto_register_shash); EXPORT_SYMBOL_GPL(crypto_register_shash);
int crypto_unregister_shash(struct shash_alg *alg) void crypto_unregister_shash(struct shash_alg *alg)
{ {
return crypto_unregister_alg(&alg->base); crypto_unregister_alg(&alg->base);
} }
EXPORT_SYMBOL_GPL(crypto_unregister_shash); EXPORT_SYMBOL_GPL(crypto_unregister_shash);
@ -546,19 +546,12 @@ err:
} }
EXPORT_SYMBOL_GPL(crypto_register_shashes); EXPORT_SYMBOL_GPL(crypto_register_shashes);
int crypto_unregister_shashes(struct shash_alg *algs, int count) void crypto_unregister_shashes(struct shash_alg *algs, int count)
{ {
int i, ret; int i;
for (i = count - 1; i >= 0; --i) { for (i = count - 1; i >= 0; --i)
ret = crypto_unregister_shash(&algs[i]); crypto_unregister_shash(&algs[i]);
if (ret)
pr_err("Failed to unregister %s %s: %d\n",
algs[i].base.cra_driver_name,
algs[i].base.cra_name, ret);
}
return 0;
} }
EXPORT_SYMBOL_GPL(crypto_unregister_shashes); EXPORT_SYMBOL_GPL(crypto_unregister_shashes);

View File

@ -96,7 +96,7 @@ struct crypto_template *crypto_lookup_template(const char *name);
int crypto_register_instance(struct crypto_template *tmpl, int crypto_register_instance(struct crypto_template *tmpl,
struct crypto_instance *inst); struct crypto_instance *inst);
int crypto_unregister_instance(struct crypto_instance *inst); void crypto_unregister_instance(struct crypto_instance *inst);
int crypto_init_spawn(struct crypto_spawn *spawn, struct crypto_alg *alg, int crypto_init_spawn(struct crypto_spawn *spawn, struct crypto_alg *alg,
struct crypto_instance *inst, u32 mask); struct crypto_instance *inst, u32 mask);

View File

@ -68,10 +68,8 @@ int crypto_register_acomp(struct acomp_alg *alg);
* compression algorithm * compression algorithm
* *
* @alg: algorithm definition * @alg: algorithm definition
*
* Return: zero on success; error code in case of error
*/ */
int crypto_unregister_acomp(struct acomp_alg *alg); void crypto_unregister_acomp(struct acomp_alg *alg);
int crypto_register_acomps(struct acomp_alg *algs, int count); int crypto_register_acomps(struct acomp_alg *algs, int count);
void crypto_unregister_acomps(struct acomp_alg *algs, int count); void crypto_unregister_acomps(struct acomp_alg *algs, int count);

View File

@ -70,7 +70,7 @@ static inline int crypto_ahash_walk_last(struct crypto_hash_walk *walk)
} }
int crypto_register_ahash(struct ahash_alg *alg); int crypto_register_ahash(struct ahash_alg *alg);
int crypto_unregister_ahash(struct ahash_alg *alg); void crypto_unregister_ahash(struct ahash_alg *alg);
int crypto_register_ahashes(struct ahash_alg *algs, int count); int crypto_register_ahashes(struct ahash_alg *algs, int count);
void crypto_unregister_ahashes(struct ahash_alg *algs, int count); void crypto_unregister_ahashes(struct ahash_alg *algs, int count);
int ahash_register_instance(struct crypto_template *tmpl, int ahash_register_instance(struct crypto_template *tmpl,
@ -105,9 +105,9 @@ static inline void crypto_drop_ahash(struct crypto_ahash_spawn *spawn)
struct hash_alg_common *ahash_attr_alg(struct rtattr *rta, u32 type, u32 mask); struct hash_alg_common *ahash_attr_alg(struct rtattr *rta, u32 type, u32 mask);
int crypto_register_shash(struct shash_alg *alg); int crypto_register_shash(struct shash_alg *alg);
int crypto_unregister_shash(struct shash_alg *alg); void crypto_unregister_shash(struct shash_alg *alg);
int crypto_register_shashes(struct shash_alg *algs, int count); int crypto_register_shashes(struct shash_alg *algs, int count);
int crypto_unregister_shashes(struct shash_alg *algs, int count); void crypto_unregister_shashes(struct shash_alg *algs, int count);
int shash_register_instance(struct crypto_template *tmpl, int shash_register_instance(struct crypto_template *tmpl,
struct shash_instance *inst); struct shash_instance *inst);
void shash_free_instance(struct crypto_instance *inst); void shash_free_instance(struct crypto_instance *inst);

View File

@ -112,10 +112,8 @@ int crypto_register_scomp(struct scomp_alg *alg);
* compression algorithm * compression algorithm
* *
* @alg: algorithm definition * @alg: algorithm definition
*
* Return: zero on success; error code in case of error
*/ */
int crypto_unregister_scomp(struct scomp_alg *alg); void crypto_unregister_scomp(struct scomp_alg *alg);
int crypto_register_scomps(struct scomp_alg *algs, int count); int crypto_register_scomps(struct scomp_alg *algs, int count);
void crypto_unregister_scomps(struct scomp_alg *algs, int count); void crypto_unregister_scomps(struct scomp_alg *algs, int count);

View File

@ -584,9 +584,9 @@ static inline void crypto_init_wait(struct crypto_wait *wait)
* Algorithm registration interface. * Algorithm registration interface.
*/ */
int crypto_register_alg(struct crypto_alg *alg); int crypto_register_alg(struct crypto_alg *alg);
int crypto_unregister_alg(struct crypto_alg *alg); void crypto_unregister_alg(struct crypto_alg *alg);
int crypto_register_algs(struct crypto_alg *algs, int count); int crypto_register_algs(struct crypto_alg *algs, int count);
int crypto_unregister_algs(struct crypto_alg *algs, int count); void crypto_unregister_algs(struct crypto_alg *algs, int count);
/* /*
* Algorithm query interface. * Algorithm query interface.