0.3, dname.c

git-svn-id: file:///svn/unbound/trunk@229 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2007-04-04 09:47:30 +00:00
parent e49b05d0cd
commit 94288dae09
7 changed files with 152 additions and 48 deletions

View file

@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script. # Process this file with autoconf to produce a configure script.
AC_PREREQ(2.57) AC_PREREQ(2.57)
AC_INIT(unbound, 0.2, wouter@nlnetlabs.nl, unbound) AC_INIT(unbound, 0.3, wouter@nlnetlabs.nl, unbound)
CFLAGS= CFLAGS=
AC_AIX AC_AIX

View file

@ -1,3 +1,7 @@
4 April 2007: Wouter
- moved to version 0.3.
- added util/data/dname.c
3 April 2007: Wouter 3 April 2007: Wouter
- detect sign of msghdr.msg_iovlen so that the cast to that type - detect sign of msghdr.msg_iovlen so that the cast to that type
in netevent (which is there to please lint) can be correct. in netevent (which is there to please lint) can be correct.

View file

@ -137,6 +137,7 @@ dname_to_buf(ldns_buffer* b, const char* str)
} }
#include "util/data/msgreply.h" #include "util/data/msgreply.h"
#include "util/data/dname.h"
/** test query parse code */ /** test query parse code */
static void static void
msgreply_test() msgreply_test()

86
util/data/dname.c Normal file
View file

@ -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;
}
}

59
util/data/dname.h Normal file
View file

@ -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 */

View file

@ -45,29 +45,7 @@
#include "util/log.h" #include "util/log.h"
#include "util/netevent.h" #include "util/netevent.h"
#include "util/net_help.h" #include "util/net_help.h"
#include "util/data/dname.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);
}
}
int int
query_info_parse(struct query_info* m, ldns_buffer* query) 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); 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 hashvalue_t
query_info_hash(struct query_info *q) query_info_hash(struct query_info *q)
{ {

View file

@ -117,13 +117,6 @@ int query_info_compare(void* m1, void* m2);
/** clear out query info structure. */ /** clear out query info structure. */
void query_info_clear(struct query_info* m); 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 */ /** clear out reply info structure */
void reply_info_clear(struct reply_info* m); void reply_info_clear(struct reply_info* m);