refactor: reduce access to swcr_sessions[i] directly

This commit is contained in:
knakahara 2021-04-05 01:24:50 +00:00
parent 59a04e4a9e
commit cfd5cbf47a
1 changed files with 52 additions and 31 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: cryptosoft.c,v 1.59 2021/04/05 01:23:15 knakahara Exp $ */
/* $NetBSD: cryptosoft.c,v 1.60 2021/04/05 01:24:50 knakahara Exp $ */
/* $FreeBSD: src/sys/opencrypto/cryptosoft.c,v 1.2.2.1 2002/11/21 23:34:23 sam Exp $ */
/* $OpenBSD: cryptosoft.c,v 1.35 2002/04/26 08:43:50 deraadt Exp $ */
@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: cryptosoft.c,v 1.59 2021/04/05 01:23:15 knakahara Exp $");
__KERNEL_RCSID(0, "$NetBSD: cryptosoft.c,v 1.60 2021/04/05 01:24:50 knakahara Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -76,6 +76,7 @@ static int swcr_combined(struct cryptop *, int);
static int swcr_process(void *, struct cryptop *, int);
static int swcr_newsession(void *, u_int32_t *, struct cryptoini *);
static int swcr_freesession(void *, u_int64_t);
static void swcr_freesession_internal(struct swcr_data *);
static int swcryptoattach_internal(void);
@ -758,6 +759,7 @@ static int
swcr_newsession(void *arg, u_int32_t *sid, struct cryptoini *cri)
{
struct swcr_data **swd;
struct swcr_data *first, *tmp;
const struct swcr_auth_hash *axf;
const struct swcr_enc_xform *txf;
const struct swcr_comp_algo *cxf;
@ -802,15 +804,16 @@ swcr_newsession(void *arg, u_int32_t *sid, struct cryptoini *cri)
swcr_sessions = newsessions;
}
swd = &swcr_sessions[i];
*sid = i;
first = NULL;
swd = &tmp;
while (cri) {
*swd = kmem_zalloc(sizeof **swd, KM_NOSLEEP);
if (*swd == NULL) {
swcr_freesession(NULL, i);
if (first != NULL)
swcr_freesession_internal(first);
return ENOBUFS;
}
} else if (first == NULL)
first = *swd;
switch (cri->cri_alg) {
case CRYPTO_DES_CBC:
@ -850,7 +853,7 @@ swcr_newsession(void *arg, u_int32_t *sid, struct cryptoini *cri)
error = txf->setkey(&((*swd)->sw_kschedule),
cri->cri_key, cri->cri_klen / 8);
if (error) {
swcr_freesession(NULL, i);
swcr_freesession_internal(first);
return error;
}
(*swd)->sw_exf = txf;
@ -889,13 +892,13 @@ swcr_newsession(void *arg, u_int32_t *sid, struct cryptoini *cri)
authcommon:
(*swd)->sw_ictx = kmem_alloc(axf->ctxsize, KM_NOSLEEP);
if ((*swd)->sw_ictx == NULL) {
swcr_freesession(NULL, i);
swcr_freesession_internal(first);
return ENOBUFS;
}
(*swd)->sw_octx = kmem_alloc(axf->ctxsize, KM_NOSLEEP);
if ((*swd)->sw_octx == NULL) {
swcr_freesession(NULL, i);
swcr_freesession_internal(first);
return ENOBUFS;
}
@ -933,7 +936,7 @@ swcr_newsession(void *arg, u_int32_t *sid, struct cryptoini *cri)
auth2common:
(*swd)->sw_ictx = kmem_alloc(axf->ctxsize, KM_NOSLEEP);
if ((*swd)->sw_ictx == NULL) {
swcr_freesession(NULL, i);
swcr_freesession_internal(first);
return ENOBUFS;
}
@ -941,7 +944,7 @@ swcr_newsession(void *arg, u_int32_t *sid, struct cryptoini *cri)
(*swd)->sw_octx = kmem_alloc(cri->cri_klen / 8,
KM_NOSLEEP);
if ((*swd)->sw_octx == NULL) {
swcr_freesession(NULL, i);
swcr_freesession_internal(first);
return ENOBUFS;
}
@ -964,7 +967,7 @@ swcr_newsession(void *arg, u_int32_t *sid, struct cryptoini *cri)
auth3common:
(*swd)->sw_ictx = kmem_alloc(axf->ctxsize, KM_NOSLEEP);
if ((*swd)->sw_ictx == NULL) {
swcr_freesession(NULL, i);
swcr_freesession_internal(first);
return ENOBUFS;
}
@ -986,7 +989,7 @@ swcr_newsession(void *arg, u_int32_t *sid, struct cryptoini *cri)
auth4common:
(*swd)->sw_ictx = kmem_alloc(axf->ctxsize, KM_NOSLEEP);
if ((*swd)->sw_ictx == NULL) {
swcr_freesession(NULL, i);
swcr_freesession_internal(first);
return ENOBUFS;
}
axf->Init((*swd)->sw_ictx);
@ -1010,7 +1013,7 @@ swcr_newsession(void *arg, u_int32_t *sid, struct cryptoini *cri)
(*swd)->sw_cxf = cxf;
break;
default:
swcr_freesession(NULL, i);
swcr_freesession_internal(first);
return EINVAL;
}
@ -1018,30 +1021,25 @@ swcr_newsession(void *arg, u_int32_t *sid, struct cryptoini *cri)
cri = cri->cri_next;
swd = &((*swd)->sw_next);
}
swcr_sessions[i] = first;
*sid = i;
return 0;
}
/*
* Free a session.
*/
static int
swcr_freesession(void *arg, u_int64_t tid)
static void
swcr_freesession_internal(struct swcr_data *arg)
{
struct swcr_data *swd;
struct swcr_data *swd, *swd0;
const struct swcr_enc_xform *txf;
const struct swcr_auth_hash *axf;
u_int32_t sid = ((u_int32_t) tid) & 0xffffffff;
if (sid > swcr_sesnum || swcr_sessions == NULL ||
swcr_sessions[sid] == NULL)
return EINVAL;
if (arg == NULL)
return;
/* Silently accept and return */
if (sid == 0)
return 0;
while ((swd = swcr_sessions[sid]) != NULL) {
swcr_sessions[sid] = swd->sw_next;
swd0 = arg;
while ((swd = swd0) != NULL) {
swd0 = swd->sw_next;
switch (swd->sw_alg) {
case CRYPTO_DES_CBC:
@ -1119,6 +1117,29 @@ swcr_freesession(void *arg, u_int64_t tid)
free(swd, M_CRYPTO_DATA);
}
}
/*
* Free a session.
*/
static int
swcr_freesession(void *arg, u_int64_t tid)
{
struct swcr_data *swd;
u_int32_t sid = ((u_int32_t) tid) & 0xffffffff;
if (sid > swcr_sesnum || swcr_sessions == NULL ||
swcr_sessions[sid] == NULL)
return EINVAL;
/* Silently accept and return */
if (sid == 0)
return 0;
swd = swcr_sessions[sid];
swcr_sessions[sid] = NULL;
swcr_freesession_internal(swd);
return 0;
}