From 94288dae09faf56fb99e4d738565a0eab84cfb04 Mon Sep 17 00:00:00 2001 From: Wouter Wijngaards Date: Wed, 4 Apr 2007 09:47:30 +0000 Subject: [PATCH] 0.3, dname.c git-svn-id: file:///svn/unbound/trunk@229 be551aaa-1e26-0410-a405-d3ace91eadb9 --- configure.ac | 2 +- doc/Changelog | 4 +++ testcode/unitmain.c | 1 + util/data/dname.c | 86 ++++++++++++++++++++++++++++++++++++++++++++ util/data/dname.h | 59 ++++++++++++++++++++++++++++++ util/data/msgreply.c | 41 +-------------------- util/data/msgreply.h | 7 ---- 7 files changed, 152 insertions(+), 48 deletions(-) create mode 100644 util/data/dname.c create mode 100644 util/data/dname.h diff --git a/configure.ac b/configure.ac index a2ee74fc4..a38e664f2 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.57) -AC_INIT(unbound, 0.2, wouter@nlnetlabs.nl, unbound) +AC_INIT(unbound, 0.3, wouter@nlnetlabs.nl, unbound) CFLAGS= AC_AIX diff --git a/doc/Changelog b/doc/Changelog index f0d9c134b..5bd862272 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,7 @@ +4 April 2007: Wouter + - moved to version 0.3. + - added util/data/dname.c + 3 April 2007: Wouter - detect sign of msghdr.msg_iovlen so that the cast to that type in netevent (which is there to please lint) can be correct. diff --git a/testcode/unitmain.c b/testcode/unitmain.c index f79d6e99f..5f16d8970 100644 --- a/testcode/unitmain.c +++ b/testcode/unitmain.c @@ -137,6 +137,7 @@ dname_to_buf(ldns_buffer* b, const char* str) } #include "util/data/msgreply.h" +#include "util/data/dname.h" /** test query parse code */ static void msgreply_test() diff --git a/util/data/dname.c b/util/data/dname.c new file mode 100644 index 000000000..79e4e8087 --- /dev/null +++ b/util/data/dname.c @@ -0,0 +1,86 @@ +/* + * util/data/dname.h - domain name handling + * + * Copyright (c) 2007, NLnet Labs. All rights reserved. + * + * This software is open source. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of the NLNET LABS nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * \file + * + * This file contains domain name handling functions. + */ + +#include "config.h" +#include "util/data/dname.h" +#include "util/log.h" + +/** determine length of a dname in buffer, no compression pointers allowed. */ +size_t +query_dname_len(ldns_buffer* query) +{ + size_t len = 0; + size_t labellen; + while(1) { + if(ldns_buffer_remaining(query) < 1) + return 0; /* parse error, need label len */ + labellen = ldns_buffer_read_u8(query); + if(labellen & 0xC0) + return 0; /* no compression allowed in queries */ + len += labellen + 1; + if(len > LDNS_MAX_DOMAINLEN) + return 0; /* too long */ + if(labellen == 0) + return len; + if(ldns_buffer_remaining(query) < labellen) + return 0; /* parse error, need content */ + ldns_buffer_skip(query, (ssize_t)labellen); + } +} + +void +query_dname_tolower(uint8_t* dname, size_t len) +{ + /* the dname is stored uncompressed */ + uint8_t labellen; + log_assert(len > 0); + labellen = *dname; + while(labellen) { + dname++; + while(labellen--) { + *dname = (uint8_t)tolower((int)*dname); + dname++; + } + labellen = *dname; + } +} + + diff --git a/util/data/dname.h b/util/data/dname.h new file mode 100644 index 000000000..e76ea2294 --- /dev/null +++ b/util/data/dname.h @@ -0,0 +1,59 @@ +/* + * util/data/dname.h - domain name routines + * + * Copyright (c) 2007, NLnet Labs. All rights reserved. + * + * This software is open source. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of the NLNET LABS nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * \file + * + * This file contains functions to deal with domain names (dnames). + * + * Some of the functions deal with domain names as a wireformat buffer, + * with a length. + */ + +#ifndef UTIL_DATA_DNAME_H +#define UTIL_DATA_DNAME_H + +/** + * Determine length of dname in buffer, no compression ptrs allowed, + * @param query: the ldns buffer, current position at start of dname. + * at end, position is at end of the dname. + * @return: 0 on parse failure, or length including ending 0 of dname. + */ +size_t query_dname_len(ldns_buffer* query); + +/** lowercase query dname */ +void query_dname_tolower(uint8_t* dname, size_t len); + +#endif /* UTIL_DATA_DNAME_H */ diff --git a/util/data/msgreply.c b/util/data/msgreply.c index 374ac8764..46a575a3f 100644 --- a/util/data/msgreply.c +++ b/util/data/msgreply.c @@ -45,29 +45,7 @@ #include "util/log.h" #include "util/netevent.h" #include "util/net_help.h" - -/** determine length of a dname in buffer, no compression pointers allowed. */ -size_t -query_dname_len(ldns_buffer* query) -{ - size_t len = 0; - size_t labellen; - while(1) { - if(ldns_buffer_remaining(query) < 1) - return 0; /* parse error, need label len */ - labellen = ldns_buffer_read_u8(query); - if(labellen & 0xC0) - return 0; /* no compression allowed in queries */ - len += labellen + 1; - if(len > LDNS_MAX_DOMAINLEN) - return 0; /* too long */ - if(labellen == 0) - return len; - if(ldns_buffer_remaining(query) < labellen) - return 0; /* parse error, need content */ - ldns_buffer_skip(query, (ssize_t)labellen); - } -} +#include "util/data/dname.h" int query_info_parse(struct query_info* m, ldns_buffer* query) @@ -167,23 +145,6 @@ reply_info_delete(void* d, void* ATTR_UNUSED(arg)) free(r); } -void -query_dname_tolower(uint8_t* dname, size_t len) -{ - /* the dname is stored uncompressed */ - uint8_t labellen; - log_assert(len > 0); - labellen = *dname; - while(labellen) { - dname++; - while(labellen--) { - *dname = (uint8_t)tolower((int)*dname); - dname++; - } - labellen = *dname; - } -} - hashvalue_t query_info_hash(struct query_info *q) { diff --git a/util/data/msgreply.h b/util/data/msgreply.h index ecf94505c..5d7dafb93 100644 --- a/util/data/msgreply.h +++ b/util/data/msgreply.h @@ -117,13 +117,6 @@ int query_info_compare(void* m1, void* m2); /** clear out query info structure. */ void query_info_clear(struct query_info* m); -/** helper routine, determine length of dname in buffer, no compression ptrs - * allowed, returns 0 on parse failure. */ -size_t query_dname_len(ldns_buffer* query); - -/** lowercase query dname */ -void query_dname_tolower(uint8_t* dname, size_t len); - /** clear out reply info structure */ void reply_info_clear(struct reply_info* m); -- 2.47.2