X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/9bccf70c0258c7cac2dcb80011b2a964d884c552..c3c9b80d004dbbfdf763edeb97968c6997e3b45b:/bsd/netkey/keydb.c diff --git a/bsd/netkey/keydb.c b/bsd/netkey/keydb.c index a96589042..b309e656c 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,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