Module Name: src
Committed By: knakahara
Date: Wed May 10 03:26:33 UTC 2017
Modified Files:
src/sys/opencrypto: crypto.c
Log Message:
unify implementation of crypto_unregister() and crypto_unregister_all()
To generate a diff of this commit:
cvs rdiff -u -r1.61 -r1.62 src/sys/opencrypto/crypto.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/opencrypto/crypto.c
diff -u src/sys/opencrypto/crypto.c:1.61 src/sys/opencrypto/crypto.c:1.62
--- src/sys/opencrypto/crypto.c:1.61 Wed May 10 03:23:26 2017
+++ src/sys/opencrypto/crypto.c Wed May 10 03:26:33 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: crypto.c,v 1.61 2017/05/10 03:23:26 knakahara Exp $ */
+/* $NetBSD: crypto.c,v 1.62 2017/05/10 03:26:33 knakahara Exp $ */
/* $FreeBSD: src/sys/opencrypto/crypto.c,v 1.4.2.5 2003/02/26 00:14:05 sam Exp $ */
/* $OpenBSD: crypto.c,v 1.41 2002/07/17 23:52:38 art Exp $ */
@@ -53,7 +53,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: crypto.c,v 1.61 2017/05/10 03:23:26 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: crypto.c,v 1.62 2017/05/10 03:26:33 knakahara Exp $");
#include <sys/param.h>
#include <sys/reboot.h>
@@ -613,7 +613,7 @@ crypto_register(u_int32_t driverid, int
}
static int
-crypto_unregister_locked(u_int32_t driverid, int alg)
+crypto_unregister_locked(u_int32_t driverid, int alg, bool all)
{
int i;
u_int32_t ses;
@@ -626,19 +626,23 @@ crypto_unregister_locked(u_int32_t drive
return EINVAL;
cap = crypto_checkdriver(driverid);
- if (cap == NULL || cap->cc_alg[alg] == 0)
+ if (cap == NULL || (!all && cap->cc_alg[alg] == 0))
return EINVAL;
cap->cc_alg[alg] = 0;
cap->cc_max_op_len[alg] = 0;
- /* Was this the last algorithm ? */
- for (i = CRYPTO_ALGORITHM_MIN; i <= CRYPTO_ALGORITHM_MAX; i++)
- if (cap->cc_alg[i] != 0) {
+ if (all) {
+ if (alg != CRYPTO_ALGORITHM_MAX)
lastalg = false;
- break;
- }
-
+ } else {
+ /* Was this the last algorithm ? */
+ for (i = CRYPTO_ALGORITHM_MIN; i <= CRYPTO_ALGORITHM_MAX; i++)
+ if (cap->cc_alg[i] != 0) {
+ lastalg = false;
+ break;
+ }
+ }
if (lastalg) {
ses = cap->cc_sessions;
memset(cap, 0, sizeof(struct cryptocap));
@@ -666,7 +670,7 @@ crypto_unregister(u_int32_t driverid, in
int err;
mutex_enter(&crypto_drv_mtx);
- err = crypto_unregister_locked(driverid, alg);
+ err = crypto_unregister_locked(driverid, alg, false);
mutex_exit(&crypto_drv_mtx);
return err;
@@ -678,39 +682,20 @@ crypto_unregister(u_int32_t driverid, in
* around so that subsequent calls using those sessions will
* correctly detect the driver has been unregistered and reroute
* requests.
- *
- * XXX careful. Don't change this to call crypto_unregister() for each
- * XXX registered algorithm unless you drop the mutex across the calls;
- * XXX you can't take it recursively.
*/
int
crypto_unregister_all(u_int32_t driverid)
{
- int i, err;
- u_int32_t ses;
- struct cryptocap *cap;
+ int err, i;
mutex_enter(&crypto_drv_mtx);
- cap = crypto_checkdriver(driverid);
- if (cap != NULL) {
- for (i = CRYPTO_ALGORITHM_MIN; i <= CRYPTO_ALGORITHM_MAX; i++) {
- cap->cc_alg[i] = 0;
- cap->cc_max_op_len[i] = 0;
- }
- ses = cap->cc_sessions;
- memset(cap, 0, sizeof(struct cryptocap));
- if (ses != 0) {
- /*
- * If there are pending sessions, just mark as invalid.
- */
- cap->cc_flags |= CRYPTOCAP_F_CLEANUP;
- cap->cc_sessions = ses;
- }
- err = 0;
- } else
- err = EINVAL;
-
+ for (i = CRYPTO_ALGORITHM_MIN; i <= CRYPTO_ALGORITHM_MAX; i++) {
+ err = crypto_unregister_locked(driverid, i, true);
+ if (err)
+ break;
+ }
mutex_exit(&crypto_drv_mtx);
+
return err;
}