acl.c revision 9c3531d72aeaad6c5f01efe6a1c82023e1379e4d
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 1999, 2000 Internet Software Consortium.
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Permission to use, copy, modify, and distribute this software for any
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * purpose with or without fee is hereby granted, provided that the above
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * copyright notice and this permission notice appear in all copies.
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer *
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
70e5a7403f0e0a3bd292b8287c5fed5772c15270Automatic Updater * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * SOFTWARE.
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer */
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer/* $Id: acl.c,v 1.11 2000/06/22 21:54:16 tale Exp $ */
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer#include <config.h>
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer#include <isc/mem.h>
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer#include <isc/string.h>
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer#include <isc/util.h>
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer#include <dns/acl.h>
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerisc_result_t
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_acl_create(isc_mem_t *mctx, int n, dns_acl_t **target) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer isc_result_t result;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_acl_t *acl;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer /*
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer * Work around silly limitation of isc_mem_get().
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer */
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (n == 0)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer n = 1;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl = isc_mem_get(mctx, sizeof(*acl));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (acl == NULL)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_R_NOMEMORY);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->mctx = mctx;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->name = NULL;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->refcount = 1;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->elements = NULL;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->alloc = 0;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->length = 0;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer ISC_LINK_INIT(acl, nextincache);
945f7311ca5ae0005676e3c4e02c712d6f8e7eafAndreas Gustafsson /*
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * Must set magic early because we use dns_acl_detach() to clean up.
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer */
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer acl->magic = DNS_ACL_MAGIC;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->elements = isc_mem_get(mctx, n * sizeof(dns_aclelement_t));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (acl->elements == NULL) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer result = ISC_R_NOMEMORY;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer goto cleanup;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer }
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->alloc = n;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer memset(acl->elements, 0, n * sizeof(dns_aclelement_t));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer *target = acl;
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer return (ISC_R_SUCCESS);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer cleanup:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_acl_detach(&acl);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (result);
931e557ecf7758d62bd342a0dae32472f6ee6ba1Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerisc_result_t
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_acl_appendelement(dns_acl_t *acl, dns_aclelement_t *elt) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (acl->length + 1 > acl->alloc) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer /*
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * Resize the ACL.
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer */
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer unsigned int newalloc;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer void *newmem;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer newalloc = acl->alloc * 2;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (newalloc < 4)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer newalloc = 4;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer newmem = isc_mem_get(acl->mctx,
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews newalloc * sizeof(dns_aclelement_t));
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews if (newmem == NULL)
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews return (ISC_R_NOMEMORY);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer memcpy(newmem, acl->elements,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->length * sizeof(dns_aclelement_t));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer isc_mem_put(acl->mctx, acl->elements,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->alloc * sizeof(dns_aclelement_t));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->elements = newmem;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->alloc = newalloc;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer }
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews /*
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * Append the new element.
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer */
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->elements[acl->length++] = *elt;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_R_SUCCESS);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerstatic isc_result_t
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_acl_anyornone(isc_mem_t *mctx, isc_boolean_t neg, dns_acl_t **target) {
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer isc_result_t result;
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer dns_acl_t *acl = NULL;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer result = dns_acl_create(mctx, 1, &acl);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (result != ISC_R_SUCCESS)
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews return (result);
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews acl->elements[0].negative = neg;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->elements[0].type = dns_aclelementtype_any;
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer acl->length = 1;
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer *target = acl;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (result);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerisc_result_t
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_acl_any(isc_mem_t *mctx, dns_acl_t **target) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (dns_acl_anyornone(mctx, ISC_FALSE, target));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerisc_result_t
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_acl_none(isc_mem_t *mctx, dns_acl_t **target) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (dns_acl_anyornone(mctx, ISC_TRUE, target));
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerisc_result_t
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_acl_match(isc_netaddr_t *reqaddr,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_name_t *reqsigner,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_acl_t *acl,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_aclenv_t *env,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer int *match,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_aclelement_t **matchelt)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer{
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer isc_result_t result;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer unsigned int i;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer int indirectmatch;
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer REQUIRE(reqaddr != NULL);
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer REQUIRE(matchelt == NULL || *matchelt == NULL);
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer for (i = 0; i < acl->length; i++) {
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer dns_aclelement_t *e = &acl->elements[i];
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer dns_acl_t *inner = NULL;
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer
6fedbb60b2adf453249eff484b5a6cab22be5a09Danny Mayer switch (e->type) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_ipprefix:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (isc_netaddr_eqprefix(reqaddr,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer &e->u.ip_prefix.address,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer e->u.ip_prefix.prefixlen))
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer goto matched;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer break;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_keyname:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (reqsigner != NULL &&
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_name_equal(reqsigner, &e->u.keyname))
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer goto matched;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer break;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_nestedacl:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer inner = e->u.nestedacl;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer nested:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer result = dns_acl_match(reqaddr, reqsigner,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer inner,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer env,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer &indirectmatch, matchelt);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (result != ISC_R_SUCCESS)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (result);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer /*
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * Treat negative matches in indirect ACLs as
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * "no match".
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * That way, a negated indirect ACL will never become
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * a surprise positive match through double negation.
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * XXXDCL this should be documented.
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer */
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (indirectmatch > 0)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer goto matched;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer /*
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * A negative indirect match may have set *matchelt,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer * but we don't want it set when we return.
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer */
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (matchelt != NULL)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer *matchelt = NULL;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer break;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_any:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer matched:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer *match = e->negative ? -(i+1) : (i+1);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (matchelt != NULL)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer *matchelt = e;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_R_SUCCESS);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_localhost:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (env != NULL && env->localhost != NULL) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer inner = env->localhost;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer goto nested;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer } else {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer break;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer }
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_localnets:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (env != NULL && env->localnets != NULL) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer inner = env->localnets;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer goto nested;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer } else {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer break;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer }
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer default:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer INSIST(0);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer break;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer }
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer }
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer /* No match. */
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer *match = 0;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_R_SUCCESS);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayervoid
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_acl_attach(dns_acl_t *source, dns_acl_t **target) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer REQUIRE(DNS_ACL_VALID(source));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer INSIST(source->refcount > 0);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer source->refcount++;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer *target = source;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerstatic void
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdestroy(dns_acl_t *dacl) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer unsigned int i;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer for (i = 0; i < dacl->length; i++) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_aclelement_t *de = &dacl->elements[i];
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer switch (de->type) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_keyname:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_name_free(&de->u.keyname, dacl->mctx);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer break;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_nestedacl:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_acl_detach(&de->u.nestedacl);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer break;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer default:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer break;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer }
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer }
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (dacl->elements != NULL)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer isc_mem_put(dacl->mctx, dacl->elements,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dacl->alloc * sizeof(dns_aclelement_t));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dacl->magic = 0;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer isc_mem_put(dacl->mctx, dacl, sizeof(*dacl));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayervoid
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_acl_detach(dns_acl_t **aclp) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_acl_t *acl = *aclp;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer REQUIRE(DNS_ACL_VALID(acl));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer INSIST(acl->refcount > 0);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer acl->refcount--;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (acl->refcount == 0)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer destroy(acl);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer *aclp = NULL;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerisc_boolean_t
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_aclelement_equal(dns_aclelement_t *ea, dns_aclelement_t *eb) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (ea->type != eb->type)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_FALSE);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer switch (ea->type) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_ipprefix:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (ea->u.ip_prefix.prefixlen !=
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer eb->u.ip_prefix.prefixlen)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_FALSE);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (isc_netaddr_equal(&ea->u.ip_prefix.address,
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer &eb->u.ip_prefix.address));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_keyname:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (dns_name_equal(&ea->u.keyname, &eb->u.keyname));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_nestedacl:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (dns_acl_equal(ea->u.nestedacl, eb->u.nestedacl));
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_localhost:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_localnets:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer case dns_aclelementtype_any:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_TRUE);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer default:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer INSIST(0);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_FALSE);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer }
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerisc_boolean_t
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_acl_equal(dns_acl_t *a, dns_acl_t *b) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer unsigned int i;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (a == b)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_TRUE);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (a->length != b->length)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_FALSE);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer for (i = 0; i < a->length; i++) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (! dns_aclelement_equal(&a->elements[i],
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer &b->elements[i]))
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_FALSE);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer }
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_TRUE);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerisc_result_t
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_aclenv_init(isc_mem_t *mctx, dns_aclenv_t *env) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer isc_result_t result;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer env->localhost = NULL;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer env->localnets = NULL;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer result = dns_acl_create(mctx, 0, &env->localhost);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (result != ISC_R_SUCCESS)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer goto cleanup_nothing;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer result = dns_acl_create(mctx, 0, &env->localnets);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer if (result != ISC_R_SUCCESS)
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer goto cleanup_localhost;
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (ISC_R_SUCCESS);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer cleanup_localhost:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_acl_detach(&env->localhost);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer cleanup_nothing:
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer return (result);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayervoid
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_aclenv_copy(dns_aclenv_t *t, dns_aclenv_t *s) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_acl_detach(&t->localhost);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_acl_attach(s->localhost, &t->localhost);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_acl_detach(&t->localnets);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_acl_attach(s->localnets, &t->localnets);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayervoid
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayerdns_aclenv_destroy(dns_aclenv_t *env) {
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_acl_detach(&env->localhost);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer dns_acl_detach(&env->localnets);
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer}
6f2e507e7e27509af16f5b48cac577fe09b66147Danny Mayer