]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/netkey/keydb.c
xnu-7195.101.1.tar.gz
[apple/xnu.git] / bsd / netkey / keydb.c
index a9658904202f4b7b08dab8015eb6fecfdf95d839..b309e656c7db9c39e5fa86627afc6dba0979c40f 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,28 +107,39 @@ 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++)
+       }
+       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;
+struct secashead *p;
 {
-
        _FREE(p, M_SECA);
 }
 
+
+
 /*
  * secasvar management (reference counted)
  */
@@ -110,9 +148,12 @@ 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)
+       if (!p) {
                return p;
+       }
        bzero(p, sizeof(*p));
        p->refcnt = 1;
        return p;
@@ -120,77 +161,87 @@ keydb_newsecasvar()
 
 void
 keydb_refsecasvar(p)
-       struct secasvar *p;
+struct secasvar *p;
 {
-       int s;
+       LCK_MTX_ASSERT(sadb_mutex, LCK_MTX_ASSERT_OWNED);
 
-       s = splnet();
        p->refcnt++;
-       splx(s);
 }
 
 void
 keydb_freesecasvar(p)
-       struct secasvar *p;
+struct secasvar *p;
 {
-       int s;
+       LCK_MTX_ASSERT(sadb_mutex, LCK_MTX_ASSERT_OWNED);
 
-       s = splnet();
        p->refcnt--;
        /* negative refcnt will cause panic intentionally */
-       if (p->refcnt <= 0)
+       if (p->refcnt <= 0) {
                keydb_delsecasvar(p);
-       splx(s);
+       }
 }
 
 static void
 keydb_delsecasvar(p)
-       struct secasvar *p;
+struct secasvar *p;
 {
-
-       if (p->refcnt)
+       if (p->refcnt) {
                panic("keydb_delsecasvar called with refcnt != 0");
+       }
 
        _FREE(p, M_SECA);
 }
+#endif
 
 /*
  * secreplay management
  */
 struct secreplay *
-keydb_newsecreplay(wsize)
-       size_t wsize;
+keydb_newsecreplay(u_int8_t wsize)
 {
        struct secreplay *p;
 
-       p = (struct secreplay *)_MALLOC(sizeof(*p), M_SECA, M_WAITOK);
-       if (!p)
+       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)
+       if (p->bitmap) {
                _FREE(p->bitmap, M_SECA);
+       }
        _FREE(p, M_SECA);
 }
 
-/*
+#if 0
+/*     NOT USED
  * secreg management
  */
 struct secreg *
@@ -199,15 +250,16 @@ keydb_newsecreg()
        struct secreg *p;
 
        p = (struct secreg *)_MALLOC(sizeof(*p), M_SECA, M_WAITOK);
-       if (p)
+       if (p) {
                bzero(p, sizeof(*p));
+       }
        return p;
 }
 
 void
 keydb_delsecreg(p)
-       struct secreg *p;
+struct secreg *p;
 {
-
        _FREE(p, M_SECA);
 }
+#endif