]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netkey/keydb.c
xnu-3248.50.21.tar.gz
[apple/xnu.git] / bsd / netkey / keydb.c
index d9bf27f604a8d55bca964df1f86b2250b5338dcd..f1d5c830b9f06499caeb696cf7867a2b129e14b6 100644 (file)
  * SUCH DAMAGE.
  */
 
-#if (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(__NetBSD__)
-#include "opt_inet.h"
-#ifdef __NetBSD__
-#include "opt_ipsec.h"
-#endif
-#endif
-
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/param.h>
 
 #include <net/net_osdep.h>
 
-#if defined(__FreeBSD__) && __FreeBSD__ >= 3
+extern lck_mtx_t  *sadb_mutex;
+
 MALLOC_DEFINE(M_SECA, "key mgmt", "security associations, key management");
-#endif
 
-static void keydb_delsecasvar __P((struct secasvar *));
+// static void keydb_delsecasvar(struct secasvar *); // not used
 
 /*
  * secpolicy management
@@ -70,11 +63,10 @@ keydb_newsecpolicy()
 {
        struct secpolicy *p;
 
-       p = (struct secpolicy *)_MALLOC(sizeof(*p), M_SECA, M_WAITOK);
-       if (!p)
-               return p;
-       bzero(p, sizeof(*p));
-       return p;
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_NOTOWNED);
+
+       return (struct secpolicy *)_MALLOC(sizeof(*p), M_SECA,
+           M_WAITOK | M_ZERO);
 }
 
 void
@@ -94,15 +86,23 @@ keydb_newsecashead()
        struct secashead *p;
        int i;
 
-       p = (struct secashead *)_MALLOC(sizeof(*p), M_SECA, M_WAITOK);
-       if (!p)
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_OWNED);
+
+       p = (struct secashead *)_MALLOC(sizeof(*p), M_SECA, M_NOWAIT | M_ZERO);
+       if (!p) {
+               lck_mtx_unlock(sadb_mutex);
+               p = (struct secashead *)_MALLOC(sizeof(*p), M_SECA,
+                   M_WAITOK | M_ZERO);
+               lck_mtx_lock(sadb_mutex);
+       }
+       if (!p) 
                return p;
-       bzero(p, sizeof(*p));
        for (i = 0; i < sizeof(p->savtree)/sizeof(p->savtree[0]); i++)
                LIST_INIT(&p->savtree[i]);
        return p;
 }
 
+#if 0
 void
 keydb_delsecashead(p)
        struct secashead *p;
@@ -111,7 +111,9 @@ keydb_delsecashead(p)
        _FREE(p, M_SECA);
 }
 
-/*
+
+
+/* 
  * secasvar management (reference counted)
  */
 struct secasvar *
@@ -119,6 +121,8 @@ keydb_newsecasvar()
 {
        struct secasvar *p;
 
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_NOTOWNED);
+
        p = (struct secasvar *)_MALLOC(sizeof(*p), M_SECA, M_WAITOK);
        if (!p)
                return p;
@@ -131,32 +135,23 @@ void
 keydb_refsecasvar(p)
        struct secasvar *p;
 {
-       int s;
 
-#ifdef __NetBSD__
-       s = splsoftnet();
-#else
-       s = splnet();
-#endif
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_OWNED);
+
        p->refcnt++;
-       splx(s);
 }
 
 void
 keydb_freesecasvar(p)
        struct secasvar *p;
 {
-       int s;
 
-#ifdef __NetBSD__
-       s = splsoftnet();
-#else
-       s = splnet();
-#endif
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_OWNED);
+
        p->refcnt--;
-       if (p->refcnt == 0)
+       /* negative refcnt will cause panic intentionally */
+       if (p->refcnt <= 0)
                keydb_delsecasvar(p);
-       splx(s);
 }
 
 static void
@@ -169,6 +164,7 @@ keydb_delsecasvar(p)
 
        _FREE(p, M_SECA);
 }
+#endif
 
 /*
  * secreplay management
@@ -178,19 +174,31 @@ keydb_newsecreplay(wsize)
        size_t wsize;
 {
        struct secreplay *p;
-
-       p = (struct secreplay *)_MALLOC(sizeof(*p), M_SECA, M_WAITOK);
+       
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_OWNED);
+
+       p = (struct secreplay *)_MALLOC(sizeof(*p), M_SECA, M_NOWAIT | M_ZERO);
+       if (!p) {
+               lck_mtx_unlock(sadb_mutex);
+               p = (struct secreplay *)_MALLOC(sizeof(*p), M_SECA,
+                   M_WAITOK | M_ZERO);
+               lck_mtx_lock(sadb_mutex);
+       }
        if (!p)
                return p;
 
-       bzero(p, sizeof(*p));
        if (wsize != 0) {
-               p->bitmap = (caddr_t)_MALLOC(wsize, M_SECA, M_WAITOK);
+               p->bitmap = (caddr_t)_MALLOC(wsize, M_SECA, M_NOWAIT | M_ZERO);
                if (!p->bitmap) {
-                       _FREE(p, M_SECA);
-                       return NULL;
+                       lck_mtx_unlock(sadb_mutex);
+                       p->bitmap = (caddr_t)_MALLOC(wsize, M_SECA,
+                           M_WAITOK | M_ZERO);
+                       lck_mtx_lock(sadb_mutex);
+                       if (!p->bitmap) {
+                               _FREE(p, M_SECA);
+                               return NULL;
+                       }
                }
-               bzero(p->bitmap, wsize);
        }
        p->wsize = wsize;
        return p;
@@ -206,7 +214,8 @@ keydb_delsecreplay(p)
        _FREE(p, M_SECA);
 }
 
-/*
+#if 0
+/*     NOT USED
  * secreg management
  */
 struct secreg *
@@ -227,3 +236,4 @@ keydb_delsecreg(p)
 
        _FREE(p, M_SECA);
 }
+#endif