]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netkey/keydb.c
xnu-3789.70.16.tar.gz
[apple/xnu.git] / bsd / netkey / keydb.c
index a9658904202f4b7b08dab8015eb6fecfdf95d839..eba59f7283938263858832892f4d5a075adaca86 100644 (file)
@@ -1,3 +1,31 @@
+/*
+ * Copyright (c) 2016 Apple Inc. All rights reserved.
+ *
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
+ *
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
+ *
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ *
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ *
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
+ */
+
 /*     $KAME: keydb.c,v 1.61 2000/03/25 07:24:13 sumikawa Exp $        */
 
 /*
 
 #include <net/net_osdep.h>
 
+extern lck_mtx_t  *sadb_mutex;
+
 MALLOC_DEFINE(M_SECA, "key mgmt", "security associations, key management");
 
-static void keydb_delsecasvar __P((struct secasvar *));
+// static void keydb_delsecasvar(struct secasvar *); // not used
 
 /*
  * secpolicy management
  */
 struct secpolicy *
-keydb_newsecpolicy()
+keydb_newsecpolicy(void)
 {
        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
-keydb_delsecpolicy(p)
-       struct secpolicy *p;
+keydb_delsecpolicy(struct secpolicy *p)
 {
-
        _FREE(p, M_SECA);
 }
 
@@ -80,20 +107,28 @@ keydb_delsecpolicy(p)
  * secashead management
  */
 struct secashead *
-keydb_newsecashead()
+keydb_newsecashead(void)
 {
        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;
@@ -102,7 +137,9 @@ keydb_delsecashead(p)
        _FREE(p, M_SECA);
 }
 
-/*
+
+
+/* 
  * secasvar management (reference counted)
  */
 struct secasvar *
@@ -110,6 +147,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;
@@ -122,25 +161,23 @@ void
 keydb_refsecasvar(p)
        struct secasvar *p;
 {
-       int s;
 
-       s = splnet();
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_OWNED);
+
        p->refcnt++;
-       splx(s);
 }
 
 void
 keydb_freesecasvar(p)
        struct secasvar *p;
 {
-       int s;
 
-       s = splnet();
+       lck_mtx_assert(sadb_mutex, LCK_MTX_ASSERT_OWNED);
+
        p->refcnt--;
        /* negative refcnt will cause panic intentionally */
        if (p->refcnt <= 0)
                keydb_delsecasvar(p);
-       splx(s);
 }
 
 static void
@@ -153,44 +190,55 @@ keydb_delsecasvar(p)
 
        _FREE(p, M_SECA);
 }
+#endif
 
 /*
  * secreplay management
  */
 struct secreplay *
-keydb_newsecreplay(wsize)
-       size_t wsize;
+keydb_newsecreplay(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;
 }
 
 void
-keydb_delsecreplay(p)
-       struct secreplay *p;
+keydb_delsecreplay(struct secreplay *p)
 {
-
        if (p->bitmap)
                _FREE(p->bitmap, M_SECA);
        _FREE(p, M_SECA);
 }
 
-/*
+#if 0
+/*     NOT USED
  * secreg management
  */
 struct secreg *
@@ -211,3 +259,4 @@ keydb_delsecreg(p)
 
        _FREE(p, M_SECA);
 }
+#endif