Hi,
The crypto framework sometimes returns an error, sometimes the
callback is called, and sometimes both. So the caller cannot release
resources correctly.
A bunch of errors can or should not happen, replace them with an
assert. Remove redundant checks. crypto_invoke() should not return
the error, but pass it via callback.
Some old hardware drivers keep part of their inconsistency as I
cannot test them.
ok?
bluhm
Index: arch/amd64/amd64/aesni.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/arch/amd64/amd64/aesni.c,v
retrieving revision 1.50
diff -u -p -r1.50 aesni.c
--- arch/amd64/amd64/aesni.c 8 Jul 2021 09:22:30 -0000 1.50
+++ arch/amd64/amd64/aesni.c 5 Oct 2021 22:14:25 -0000
@@ -639,10 +639,7 @@ aesni_process(struct cryptop *crp)
int err = 0;
int i;
- if (crp == NULL || crp->crp_callback == NULL)
- return (EINVAL);
- if (crp->crp_ndesc < 1)
- return (EINVAL);
+ KASSERT(crp->crp_ndesc >= 1);
smr_read_enter();
ses = aesni_get(crp->crp_sid & 0xffffffff);
Index: arch/amd64/amd64/via.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/arch/amd64/amd64/via.c,v
retrieving revision 1.34
diff -u -p -r1.34 via.c
--- arch/amd64/amd64/via.c 8 Jul 2021 09:22:30 -0000 1.34
+++ arch/amd64/amd64/via.c 5 Oct 2021 22:14:49 -0000
@@ -420,10 +420,7 @@ viac3_crypto_process(struct cryptop *crp
int sesn, err = 0;
int i;
- if (crp == NULL || crp->crp_callback == NULL)
- return (EINVAL);
- if (crp->crp_ndesc < 1)
- return (EINVAL);
+ KASSERT(crp->crp_ndesc >= 1);
sesn = VIAC3_SESSION(crp->crp_sid);
if (sesn >= sc->sc_nsessions) {
Index: arch/arm64/arm64/cryptox.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/arch/arm64/arm64/cryptox.c,v
retrieving revision 1.2
diff -u -p -r1.2 cryptox.c
--- arch/arm64/arm64/cryptox.c 8 Jul 2021 09:22:30 -0000 1.2
+++ arch/arm64/arm64/cryptox.c 5 Oct 2021 22:33:42 -0000
@@ -447,10 +447,7 @@ cryptox_process(struct cryptop *crp)
int err = 0;
int i;
- if (crp == NULL || crp->crp_callback == NULL)
- return (EINVAL);
- if (crp->crp_ndesc < 1)
- return (EINVAL);
+ KASSERT(crp->crp_ndesc >= 1);
smr_read_enter();
ses = cryptox_get(crp->crp_sid & 0xffffffff);
Index: arch/i386/i386/via.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/arch/i386/i386/via.c,v
retrieving revision 1.47
diff -u -p -r1.47 via.c
--- arch/i386/i386/via.c 8 Jul 2021 09:22:30 -0000 1.47
+++ arch/i386/i386/via.c 5 Oct 2021 22:17:36 -0000
@@ -428,10 +428,7 @@ viac3_crypto_process(struct cryptop *crp
int sesn, err = 0;
int i;
- if (crp == NULL || crp->crp_callback == NULL)
- return (EINVAL);
- if (crp->crp_ndesc < 1)
- return (EINVAL);
+ KASSERT(crp->crp_ndesc >= 1);
sesn = VIAC3_SESSION(crp->crp_sid);
if (sesn >= sc->sc_nsessions) {
Index: arch/i386/pci/glxsb.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/arch/i386/pci/glxsb.c,v
retrieving revision 1.37
diff -u -p -r1.37 glxsb.c
--- arch/i386/pci/glxsb.c 8 Jul 2021 09:22:30 -0000 1.37
+++ arch/i386/pci/glxsb.c 5 Oct 2021 22:19:20 -0000
@@ -780,14 +780,7 @@ glxsb_crypto_process(struct cryptop *crp
s = splnet();
- if (crp == NULL || crp->crp_callback == NULL) {
- err = EINVAL;
- goto out;
- }
- if (crp->crp_ndesc < 1) {
- err = EINVAL;
- goto out;
- }
+ KASSERT(crp->crp_ndesc >= 1);
sesn = GLXSB_SESSION(crp->crp_sid);
if (sesn >= sc->sc_nsessions) {
Index: arch/octeon/dev/octcrypto.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/arch/octeon/dev/octcrypto.c,v
retrieving revision 1.5
diff -u -p -r1.5 octcrypto.c
--- arch/octeon/dev/octcrypto.c 8 Jul 2021 09:22:30 -0000 1.5
+++ arch/octeon/dev/octcrypto.c 5 Oct 2021 22:32:47 -0000
@@ -597,9 +597,6 @@ octcrypto_process(struct cryptop *crp)
int error = 0;
int i;
- if (crp == NULL || crp->crp_callback == NULL)
- return EINVAL;
-
KASSERT(crp->crp_ndesc >= 1);
smr_read_enter();
Index: dev/pci/hifn7751.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/hifn7751.c,v
retrieving revision 1.180
diff -u -p -r1.180 hifn7751.c
--- dev/pci/hifn7751.c 29 May 2020 04:42:25 -0000 1.180
+++ dev/pci/hifn7751.c 5 Oct 2021 22:20:50 -0000
@@ -1925,11 +1925,6 @@ hifn_process(struct cryptop *crp)
struct hifn_softc *sc;
struct cryptodesc *crd1, *crd2 = NULL, *maccrd, *enccrd;
- if (crp == NULL || crp->crp_callback == NULL) {
- hifnstats.hst_invalid++;
- return (EINVAL);
- }
-
if (crp->crp_ilen == 0) {
err = EINVAL;
goto errout;
Index: dev/pci/safe.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/safe.c,v
retrieving revision 1.45
diff -u -p -r1.45 safe.c
--- dev/pci/safe.c 25 Feb 2021 02:48:20 -0000 1.45
+++ dev/pci/safe.c 5 Oct 2021 22:22:58 -0000
@@ -310,11 +310,7 @@ safe_process(struct cryptop *crp)
u_int32_t cmd0, cmd1, staterec, iv[4];
s = splnet();
- if (crp == NULL || crp->crp_callback == NULL) {
- safestats.st_invalid++;
- splx(s);
- return (EINVAL);
- }
+
card = SAFE_CARD(crp->crp_sid);
if (card >= safe_cd.cd_ndevs || safe_cd.cd_devs[card] == NULL) {
safestats.st_invalid++;
Index: dev/pci/ubsec.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/ubsec.c,v
retrieving revision 1.167
diff -u -p -r1.167 ubsec.c
--- dev/pci/ubsec.c 25 Feb 2021 02:48:20 -0000 1.167
+++ dev/pci/ubsec.c 5 Oct 2021 22:24:13 -0000
@@ -781,10 +781,6 @@ ubsec_process(struct cryptop *crp)
u_int16_t flags = 0;
int ivlen = 0, keylen = 0;
- if (crp == NULL || crp->crp_callback == NULL) {
- ubsecstats.hst_invalid++;
- return (EINVAL);
- }
card = UBSEC_CARD(crp->crp_sid);
if (card >= ubsec_cd.cd_ndevs || ubsec_cd.cd_devs[card] == NULL) {
ubsecstats.hst_invalid++;
Index: crypto/crypto.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/crypto/crypto.c,v
retrieving revision 1.85
diff -u -p -r1.85 crypto.c
--- crypto/crypto.c 26 Jul 2021 21:27:56 -0000 1.85
+++ crypto/crypto.c 5 Oct 2021 22:07:26 -0000
@@ -404,7 +404,7 @@ crypto_dispatch(struct cryptop *crp)
if (crp->crp_flags & CRYPTO_F_NOQUEUE) {
if (lock)
KERNEL_LOCK();
- error = crypto_invoke(crp);
+ crypto_invoke(crp);
if (lock)
KERNEL_UNLOCK();
} else {
@@ -421,7 +421,7 @@ crypto_dispatch(struct cryptop *crp)
/*
* Dispatch a crypto request to the appropriate crypto devices.
*/
-int
+void
crypto_invoke(struct cryptop *crp)
{
u_int64_t nid;
@@ -430,17 +430,15 @@ crypto_invoke(struct cryptop *crp)
int s, i;
/* Sanity checks. */
- if (crp == NULL || crp->crp_callback == NULL)
- return EINVAL;
+ KASSERT(crp != NULL);
+ KASSERT(crp->crp_callback != NULL);
KERNEL_ASSERT_LOCKED();
s = splvm();
if (crp->crp_ndesc < 1 || crypto_drivers == NULL) {
crp->crp_etype = EINVAL;
- crypto_done(crp);
- splx(s);
- return 0;
+ goto done;
}
hid = (crp->crp_sid >> 32) & 0xffffffff;
@@ -470,7 +468,7 @@ crypto_invoke(struct cryptop *crp)
}
splx(s);
- return 0;
+ return;
migrate:
/* Migrate session. */
@@ -482,9 +480,9 @@ crypto_invoke(struct cryptop *crp)
crp->crp_sid = nid;
crp->crp_etype = EAGAIN;
+ done:
crypto_done(crp);
splx(s);
- return 0;
}
/*
Index: crypto/cryptodev.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/crypto/cryptodev.h,v
retrieving revision 1.74
diff -u -p -r1.74 cryptodev.h
--- crypto/cryptodev.h 26 Jul 2021 21:27:56 -0000 1.74
+++ crypto/cryptodev.h 5 Oct 2021 22:04:49 -0000
@@ -224,7 +224,7 @@ int crypto_register(u_int32_t, int *,
int (*)(struct cryptop *));
int crypto_unregister(u_int32_t, int);
int32_t crypto_get_driverid(u_int8_t);
-int crypto_invoke(struct cryptop *);
+void crypto_invoke(struct cryptop *);
void crypto_done(struct cryptop *);
void cuio_copydata(struct uio *, int, int, caddr_t);
Index: crypto/cryptosoft.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/crypto/cryptosoft.c,v
retrieving revision 1.88
diff -u -p -r1.88 cryptosoft.c
--- crypto/cryptosoft.c 9 Jul 2021 15:29:55 -0000 1.88
+++ crypto/cryptosoft.c 5 Oct 2021 22:17:05 -0000
@@ -1035,11 +1035,9 @@ swcr_process(struct cryptop *crp)
int type;
int i;
- /* Sanity check */
- if (crp == NULL)
- return EINVAL;
+ KASSERT(crp->crp_ndesc >= 1);
- if (crp->crp_ndesc < 1 || crp->crp_buf == NULL) {
+ if (crp->crp_buf == NULL) {
crp->crp_etype = EINVAL;
goto done;
}