diff --git a/Makefile b/Makefile index 39aeaf4..92158e0 100644 --- a/Makefile +++ b/Makefile @@ -68,7 +68,7 @@ objs = cache.o rfc1035.o util.o option.o forward.o network.o \ dnsmasq.o dhcp.o lease.o rfc2131.o netlink.o dbus.o bpf.o \ helper.o tftp.o log.o conntrack.o dhcp6.o rfc3315.o \ dhcp-common.o outpacket.o radv.o slaac.o auth.o ipset.o \ - domain.o dnssec.o dnssec-openssl.o + domain.o dnssec.o dnssec-openssl.o blockdata.o hdrs = dnsmasq.h config.h dhcp-protocol.h dhcp6-protocol.h \ dns-protocol.h radv-protocol.h diff --git a/bld/Android.mk b/bld/Android.mk index 5eb4749..309d178 100644 --- a/bld/Android.mk +++ b/bld/Android.mk @@ -9,7 +9,7 @@ LOCAL_SRC_FILES := bpf.c cache.c dbus.c dhcp.c dnsmasq.c \ rfc2131.c tftp.c util.c conntrack.c \ dhcp6.c rfc3315.c dhcp-common.c outpacket.c \ radv.c slaac.c auth.c ipset.c domain.c \ - dnssec.c dnssec-openssl.c + dnssec.c dnssec-openssl.c blockdata.c LOCAL_MODULE := dnsmasq diff --git a/src/blockdata.c b/src/blockdata.c new file mode 100644 index 0000000..be697aa --- /dev/null +++ b/src/blockdata.c @@ -0,0 +1,99 @@ +/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 dated June, 1991, or + (at your option) version 3 dated 29 June, 2007. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "dnsmasq.h" + +#ifdef HAVE_DNSSEC + +static struct blockdata *keyblock_free = NULL; + +struct blockdata *blockdata_alloc(char *data, size_t len) +{ + struct blockdata *block, *ret = NULL; + struct blockdata **prev = &ret; + size_t blen; + + while (len > 0) + { + if (keyblock_free) + { + block = keyblock_free; + keyblock_free = block->next; + } + else + block = whine_malloc(sizeof(struct blockdata)); + + if (!block) + { + /* failed to alloc, free partial chain */ + blockdata_free(ret); + return NULL; + } + + blen = len > KEYBLOCK_LEN ? KEYBLOCK_LEN : len; + memcpy(block->key, data, blen); + data += blen; + len -= blen; + *prev = block; + prev = &block->next; + block->next = NULL; + } + + return ret; +} + +size_t blockdata_walk(struct blockdata **key, unsigned char **p, size_t cnt) +{ + if (*p == NULL) + *p = (*key)->key; + else if (*p == (*key)->key + KEYBLOCK_LEN) + { + *key = (*key)->next; + if (*key == NULL) + return 0; + *p = (*key)->key; + } + + return MIN(cnt, (size_t)((*key)->key + KEYBLOCK_LEN - (*p))); +} + +void blockdata_free(struct blockdata *blocks) +{ + struct blockdata *tmp; + + if (blocks) + { + for (tmp = blocks; tmp->next; tmp = tmp->next); + tmp->next = keyblock_free; + keyblock_free = blocks; + } +} + +void blockdata_retrieve(struct blockdata *block, size_t len, void *data) +{ + size_t blen; + struct blockdata *b; + + for (b = block; len > 0 && b; b = b->next) + { + blen = len > KEYBLOCK_LEN ? KEYBLOCK_LEN : len; + memcpy(data, b->key, blen); + data += blen; + len -= blen; + } +} + +#endif diff --git a/src/cache.c b/src/cache.c index 3504183..42039ec 100644 --- a/src/cache.c +++ b/src/cache.c @@ -25,9 +25,6 @@ static int cache_inserted = 0, cache_live_freed = 0, insert_error; static union bigname *big_free = NULL; static int bignames_left, hash_size; static int uid = 1; -#ifdef HAVE_DNSSEC -static struct blockdata *keyblock_free = NULL; -#endif /* type->string mapping: this is also used by the name-hash function as a mixing table. */ static const struct { @@ -1394,83 +1391,4 @@ void log_query(unsigned int flags, char *name, struct all_addr *addr, char *arg) my_syslog(LOG_INFO, "%s %s %s %s", source, name, verb, dest); } -#ifdef HAVE_DNSSEC -struct blockdata *blockdata_alloc(char *data, size_t len) -{ - struct blockdata *block, *ret = NULL; - struct blockdata **prev = &ret; - size_t blen; - - while (len > 0) - { - if (keyblock_free) - { - block = keyblock_free; - keyblock_free = block->next; - } - else - block = whine_malloc(sizeof(struct blockdata)); - - if (!block) - { - /* failed to alloc, free partial chain */ - blockdata_free(ret); - return NULL; - } - - blen = len > KEYBLOCK_LEN ? KEYBLOCK_LEN : len; - memcpy(block->key, data, blen); - data += blen; - len -= blen; - *prev = block; - prev = &block->next; - block->next = NULL; - } - - return ret; -} - -size_t blockdata_walk(struct blockdata **key, unsigned char **p, size_t cnt) -{ - if (*p == NULL) - *p = (*key)->key; - else if (*p == (*key)->key + KEYBLOCK_LEN) - { - *key = (*key)->next; - if (*key == NULL) - return 0; - *p = (*key)->key; - } - - return MIN(cnt, (*key)->key + KEYBLOCK_LEN - (*p)); -} - -void blockdata_free(struct blockdata *blocks) -{ - struct blockdata *tmp; - - if (blocks) - { - for (tmp = blocks; tmp->next; tmp = tmp->next); - tmp->next = keyblock_free; - keyblock_free = blocks; - } -} - -void blockdata_retrieve(struct blockdata *block, size_t len, void *data) -{ - size_t blen; - struct blockdata *b; - - for (b = block; len > 0 && b; b = b->next) - { - blen = len > KEYBLOCK_LEN ? KEYBLOCK_LEN : len; - memcpy(data, b->key, blen); - data += blen; - len -= blen; - } -} - -#endif - - + diff --git a/src/dnsmasq.h b/src/dnsmasq.h index 7b106eb..c31ac64 100644 --- a/src/dnsmasq.h +++ b/src/dnsmasq.h @@ -987,6 +987,8 @@ void dump_cache(time_t now); char *cache_get_name(struct crec *crecp); char *cache_get_cname_target(struct crec *crecp); struct crec *cache_enumerate(int init); + +/* blockdata.c */ #ifdef HAVE_DNSSEC struct blockdata *blockdata_alloc(char *data, size_t len); size_t blockdata_walk(struct blockdata **key, unsigned char **p, size_t cnt);