diff options
Diffstat (limited to 'src/common/acl.c')
-rw-r--r-- | src/common/acl.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/src/common/acl.c b/src/common/acl.c index 252f3f9..26d3847 100644 --- a/src/common/acl.c +++ b/src/common/acl.c @@ -54,8 +54,8 @@ static int acl_compare(void *k1, void *k2) } /* Compare integers if IPv4. */ - if (a1->family == AF_INET) { - + if (sockaddr_family(a1) == AF_INET) { + /* Compute mask .*/ uint32_t mask = acl_fill_mask32(a1->prefix); @@ -69,21 +69,21 @@ static int acl_compare(void *k1, void *k2) /* IPv6 matching. */ #ifndef DISABLE_IPV6 - if (a1->family == AF_INET6) { - + if (sockaddr_family(a1) == AF_INET6) { + /* Get mask .*/ short chunk = a1->prefix; - + /* Compare address by 32bit chunks. */ uint32_t* a1p = (uint32_t *)(&a1->addr6.sin6_addr); uint32_t* a2p = (uint32_t *)(&a2->addr6.sin6_addr); - + /* Mask 0 = 0 bits to compare from LO->HO (in big-endian). * Mask 128 = 128 bits to compare. */ while (chunk > 0) { uint32_t mask = 0xffffffff; - if (chunk > sizeof(mask) << 3) { + if ((size_t)chunk > sizeof(mask) << 3) { chunk -= sizeof(mask) << 3; } else { mask = acl_fill_mask32(chunk); @@ -125,7 +125,7 @@ acl_t *acl_new(acl_rule_t default_rule, const char *name) free(acl); return 0; } - + /* Initialize skip list for rules with TSIG. */ /*! \todo This needs a better structure to make * nodes with TSIG preferred, but for now @@ -172,13 +172,12 @@ int acl_create(acl_t *acl, const sockaddr_t* addr, acl_rule_t rule, void *val, if (key == NULL) { return ACL_ERROR; } - + memcpy(&key->addr, addr, sizeof(sockaddr_t)); - sockaddr_update(&key->addr); key->rule = rule; key->val = val; - + if (flags & ACL_PREFER) { skip_insert(acl->rules_pref, &key->addr, key, 0); } else { @@ -198,12 +197,12 @@ int acl_match(acl_t *acl, const sockaddr_t* addr, acl_key_t **key) if (found == NULL) { found = skip_find(acl->rules, (void*)addr); } - + /* Set stored value if exists. */ if (key != NULL) { *key = found; } - + /* Return appropriate rule. */ if (found == NULL) { return acl->default_rule; |