diff options
Diffstat (limited to 'crypto/api.c')
-rw-r--r-- | crypto/api.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/crypto/api.c b/crypto/api.c index 80bba637fba7..c11ec1fd4f18 100644 --- a/crypto/api.c +++ b/crypto/api.c | |||
@@ -188,13 +188,16 @@ struct crypto_tfm *crypto_alloc_tfm(const char *name, u32 flags) | |||
188 | if (crypto_init_flags(tfm, flags)) | 188 | if (crypto_init_flags(tfm, flags)) |
189 | goto out_free_tfm; | 189 | goto out_free_tfm; |
190 | 190 | ||
191 | if (crypto_init_ops(tfm)) { | 191 | if (crypto_init_ops(tfm)) |
192 | crypto_exit_ops(tfm); | ||
193 | goto out_free_tfm; | 192 | goto out_free_tfm; |
194 | } | 193 | |
194 | if (alg->cra_init && alg->cra_init(tfm)) | ||
195 | goto cra_init_failed; | ||
195 | 196 | ||
196 | goto out; | 197 | goto out; |
197 | 198 | ||
199 | cra_init_failed: | ||
200 | crypto_exit_ops(tfm); | ||
198 | out_free_tfm: | 201 | out_free_tfm: |
199 | kfree(tfm); | 202 | kfree(tfm); |
200 | tfm = NULL; | 203 | tfm = NULL; |
@@ -215,6 +218,8 @@ void crypto_free_tfm(struct crypto_tfm *tfm) | |||
215 | alg = tfm->__crt_alg; | 218 | alg = tfm->__crt_alg; |
216 | size = sizeof(*tfm) + alg->cra_ctxsize; | 219 | size = sizeof(*tfm) + alg->cra_ctxsize; |
217 | 220 | ||
221 | if (alg->cra_exit) | ||
222 | alg->cra_exit(tfm); | ||
218 | crypto_exit_ops(tfm); | 223 | crypto_exit_ops(tfm); |
219 | crypto_alg_put(alg); | 224 | crypto_alg_put(alg); |
220 | memset(tfm, 0, size); | 225 | memset(tfm, 0, size); |
@@ -224,7 +229,7 @@ void crypto_free_tfm(struct crypto_tfm *tfm) | |||
224 | static inline int crypto_set_driver_name(struct crypto_alg *alg) | 229 | static inline int crypto_set_driver_name(struct crypto_alg *alg) |
225 | { | 230 | { |
226 | static const char suffix[] = "-generic"; | 231 | static const char suffix[] = "-generic"; |
227 | char *driver_name = (char *)alg->cra_driver_name; | 232 | char *driver_name = alg->cra_driver_name; |
228 | int len; | 233 | int len; |
229 | 234 | ||
230 | if (*driver_name) | 235 | if (*driver_name) |
@@ -262,13 +267,13 @@ int crypto_register_alg(struct crypto_alg *alg) | |||
262 | down_write(&crypto_alg_sem); | 267 | down_write(&crypto_alg_sem); |
263 | 268 | ||
264 | list_for_each_entry(q, &crypto_alg_list, cra_list) { | 269 | list_for_each_entry(q, &crypto_alg_list, cra_list) { |
265 | if (!strcmp(q->cra_driver_name, alg->cra_driver_name)) { | 270 | if (q == alg) { |
266 | ret = -EEXIST; | 271 | ret = -EEXIST; |
267 | goto out; | 272 | goto out; |
268 | } | 273 | } |
269 | } | 274 | } |
270 | 275 | ||
271 | list_add_tail(&alg->cra_list, &crypto_alg_list); | 276 | list_add(&alg->cra_list, &crypto_alg_list); |
272 | out: | 277 | out: |
273 | up_write(&crypto_alg_sem); | 278 | up_write(&crypto_alg_sem); |
274 | return ret; | 279 | return ret; |