aboutsummaryrefslogtreecommitdiff
path: root/sys/crypto/via
diff options
context:
space:
mode:
authorPawel Jakub Dawidek <pjd@FreeBSD.org>2008-08-09 19:48:59 +0000
committerPawel Jakub Dawidek <pjd@FreeBSD.org>2008-08-09 19:48:59 +0000
commitec7993f8b0f82d459a010989af4d393efaae6177 (patch)
treec816f2f1d9850cbac3868bf017ca67b3e1b52e9d /sys/crypto/via
parentf422e90330b3d9b9d3300acf02661d9c5112458b (diff)
downloadsrc-ec7993f8b0f82d459a010989af4d393efaae6177.tar.gz
src-ec7993f8b0f82d459a010989af4d393efaae6177.zip
- Fix freeing session on newsession failure.
- Update copyright years.
Notes
Notes: svn path=/head/; revision=181477
Diffstat (limited to 'sys/crypto/via')
-rw-r--r--sys/crypto/via/padlock.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/sys/crypto/via/padlock.c b/sys/crypto/via/padlock.c
index a1d2da8cf470..dddae15f245c 100644
--- a/sys/crypto/via/padlock.c
+++ b/sys/crypto/via/padlock.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2005-2006 Pawel Jakub Dawidek <pjd@FreeBSD.org>
+ * Copyright (c) 2005-2008 Pawel Jakub Dawidek <pjd@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -65,6 +65,8 @@ struct padlock_softc {
static int padlock_newsession(device_t, uint32_t *sidp, struct cryptoini *cri);
static int padlock_freesession(device_t, uint64_t tid);
+static void padlock_freesession_one(struct padlock_softc *sc,
+ struct padlock_session *ses, int locked);
static int padlock_process(device_t, struct cryptop *crp, int hint __unused);
MALLOC_DEFINE(M_PADLOCK, "padlock_data", "PadLock Data");
@@ -234,14 +236,14 @@ padlock_newsession(device_t dev, uint32_t *sidp, struct cryptoini *cri)
error = padlock_cipher_setup(ses, encini);
if (error != 0) {
- padlock_freesession(NULL, ses->ses_id);
+ padlock_freesession_one(sc, ses, 0);
return (error);
}
if (macini != NULL) {
error = padlock_hash_setup(ses, macini);
if (error != 0) {
- padlock_freesession(NULL, ses->ses_id);
+ padlock_freesession_one(sc, ses, 0);
return (error);
}
}
@@ -250,6 +252,24 @@ padlock_newsession(device_t dev, uint32_t *sidp, struct cryptoini *cri)
return (0);
}
+static void
+padlock_freesession_one(struct padlock_softc *sc, struct padlock_session *ses,
+ int locked)
+{
+ uint32_t sid = ses->ses_id;
+
+ if (!locked)
+ rw_wlock(&sc->sc_sessions_lock);
+ TAILQ_REMOVE(&sc->sc_sessions, ses, ses_next);
+ padlock_hash_free(ses);
+ bzero(ses, sizeof(*ses));
+ ses->ses_used = 0;
+ ses->ses_id = sid;
+ TAILQ_INSERT_HEAD(&sc->sc_sessions, ses, ses_next);
+ if (!locked)
+ rw_wunlock(&sc->sc_sessions_lock);
+}
+
static int
padlock_freesession(device_t dev, uint64_t tid)
{
@@ -267,12 +287,7 @@ padlock_freesession(device_t dev, uint64_t tid)
rw_wunlock(&sc->sc_sessions_lock);
return (EINVAL);
}
- TAILQ_REMOVE(&sc->sc_sessions, ses, ses_next);
- padlock_hash_free(ses);
- bzero(ses, sizeof(*ses));
- ses->ses_used = 0;
- ses->ses_id = sid;
- TAILQ_INSERT_HEAD(&sc->sc_sessions, ses, ses_next);
+ padlock_freesession_one(sc, ses, 1);
rw_wunlock(&sc->sc_sessions_lock);
return (0);
}