X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/9bccf70c0258c7cac2dcb80011b2a964d884c552..4d15aeb193b2c68f1d38666c317f8d3734f5f083:/bsd/netkey/keydb.c diff --git a/bsd/netkey/keydb.c b/bsd/netkey/keydb.c index a96589042..eba59f728 100644 --- a/bsd/netkey/keydb.c +++ b/bsd/netkey/keydb.c @@ -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 $ */ /* @@ -49,30 +77,29 @@ #include +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