mirror of
https://github.com/monero-project/monero.git
synced 2025-05-06 13:25:00 -04:00
Upgrade unbound library
These files were pulled from the 1.6.3 release tarball. This new version builds against OpenSSL version 1.1 which will be the default in the new Debian Stable which is due to be released RealSoonNow (tm).
This commit is contained in:
parent
e3da0ca828
commit
a85b5759f3
241 changed files with 33336 additions and 12049 deletions
109
external/unbound/util/data/msgparse.c
vendored
109
external/unbound/util/data/msgparse.c
vendored
|
@ -38,6 +38,7 @@
|
|||
*/
|
||||
#include "config.h"
|
||||
#include "util/data/msgparse.h"
|
||||
#include "util/data/msgreply.h"
|
||||
#include "util/data/dname.h"
|
||||
#include "util/data/packed_rrset.h"
|
||||
#include "util/storage/lookup3.h"
|
||||
|
@ -70,7 +71,7 @@ smart_compare(sldns_buffer* pkt, uint8_t* dnow,
|
|||
*/
|
||||
static struct rrset_parse*
|
||||
new_rrset(struct msg_parse* msg, uint8_t* dname, size_t dnamelen,
|
||||
uint16_t type, uint16_t dclass, hashvalue_t hash,
|
||||
uint16_t type, uint16_t dclass, hashvalue_type hash,
|
||||
uint32_t rrset_flags, sldns_pkt_section section,
|
||||
struct regional* region)
|
||||
{
|
||||
|
@ -158,13 +159,13 @@ pkt_rrset_flags(sldns_buffer* pkt, uint16_t type, sldns_pkt_section sec)
|
|||
return f;
|
||||
}
|
||||
|
||||
hashvalue_t
|
||||
hashvalue_type
|
||||
pkt_hash_rrset(sldns_buffer* pkt, uint8_t* dname, uint16_t type,
|
||||
uint16_t dclass, uint32_t rrset_flags)
|
||||
{
|
||||
/* note this MUST be identical to rrset_key_hash in packed_rrset.c */
|
||||
/* this routine handles compressed names */
|
||||
hashvalue_t h = 0xab;
|
||||
hashvalue_type h = 0xab;
|
||||
h = dname_pkt_hash(pkt, dname, h);
|
||||
h = hashlittle(&type, sizeof(type), h); /* host order */
|
||||
h = hashlittle(&dclass, sizeof(dclass), h); /* netw order */
|
||||
|
@ -173,25 +174,25 @@ pkt_hash_rrset(sldns_buffer* pkt, uint8_t* dname, uint16_t type,
|
|||
}
|
||||
|
||||
/** create partial dname hash for rrset hash */
|
||||
static hashvalue_t
|
||||
static hashvalue_type
|
||||
pkt_hash_rrset_first(sldns_buffer* pkt, uint8_t* dname)
|
||||
{
|
||||
/* works together with pkt_hash_rrset_rest */
|
||||
/* note this MUST be identical to rrset_key_hash in packed_rrset.c */
|
||||
/* this routine handles compressed names */
|
||||
hashvalue_t h = 0xab;
|
||||
hashvalue_type h = 0xab;
|
||||
h = dname_pkt_hash(pkt, dname, h);
|
||||
return h;
|
||||
}
|
||||
|
||||
/** create a rrset hash from a partial dname hash */
|
||||
static hashvalue_t
|
||||
pkt_hash_rrset_rest(hashvalue_t dname_h, uint16_t type, uint16_t dclass,
|
||||
static hashvalue_type
|
||||
pkt_hash_rrset_rest(hashvalue_type dname_h, uint16_t type, uint16_t dclass,
|
||||
uint32_t rrset_flags)
|
||||
{
|
||||
/* works together with pkt_hash_rrset_first */
|
||||
/* note this MUST be identical to rrset_key_hash in packed_rrset.c */
|
||||
hashvalue_t h;
|
||||
hashvalue_type h;
|
||||
h = hashlittle(&type, sizeof(type), dname_h); /* host order */
|
||||
h = hashlittle(&dclass, sizeof(dclass), h); /* netw order */
|
||||
h = hashlittle(&rrset_flags, sizeof(uint32_t), h);
|
||||
|
@ -200,7 +201,7 @@ pkt_hash_rrset_rest(hashvalue_t dname_h, uint16_t type, uint16_t dclass,
|
|||
|
||||
/** compare rrset_parse with data */
|
||||
static int
|
||||
rrset_parse_equals(struct rrset_parse* p, sldns_buffer* pkt, hashvalue_t h,
|
||||
rrset_parse_equals(struct rrset_parse* p, sldns_buffer* pkt, hashvalue_type h,
|
||||
uint32_t rrset_flags, uint8_t* dname, size_t dnamelen,
|
||||
uint16_t type, uint16_t dclass)
|
||||
{
|
||||
|
@ -214,8 +215,8 @@ rrset_parse_equals(struct rrset_parse* p, sldns_buffer* pkt, hashvalue_t h,
|
|||
|
||||
struct rrset_parse*
|
||||
msgparse_hashtable_lookup(struct msg_parse* msg, sldns_buffer* pkt,
|
||||
hashvalue_t h, uint32_t rrset_flags, uint8_t* dname, size_t dnamelen,
|
||||
uint16_t type, uint16_t dclass)
|
||||
hashvalue_type h, uint32_t rrset_flags, uint8_t* dname,
|
||||
size_t dnamelen, uint16_t type, uint16_t dclass)
|
||||
{
|
||||
struct rrset_parse* p = msg->hashtable[h & (PARSE_TABLE_SIZE-1)];
|
||||
while(p) {
|
||||
|
@ -387,7 +388,7 @@ change_rrsig_rrset(struct rrset_parse* sigset, struct msg_parse* msg,
|
|||
int hasother, sldns_pkt_section section, struct regional* region)
|
||||
{
|
||||
struct rrset_parse* dataset = sigset;
|
||||
hashvalue_t hash = pkt_hash_rrset(pkt, sigset->dname, datatype,
|
||||
hashvalue_type hash = pkt_hash_rrset(pkt, sigset->dname, datatype,
|
||||
sigset->rrset_class, rrset_flags);
|
||||
log_assert( sigset->type == LDNS_RR_TYPE_RRSIG );
|
||||
log_assert( datatype != LDNS_RR_TYPE_RRSIG );
|
||||
|
@ -454,14 +455,14 @@ change_rrsig_rrset(struct rrset_parse* sigset, struct msg_parse* msg,
|
|||
*/
|
||||
static int
|
||||
find_rrset(struct msg_parse* msg, sldns_buffer* pkt, uint8_t* dname,
|
||||
size_t dnamelen, uint16_t type, uint16_t dclass, hashvalue_t* hash,
|
||||
size_t dnamelen, uint16_t type, uint16_t dclass, hashvalue_type* hash,
|
||||
uint32_t* rrset_flags,
|
||||
uint8_t** prev_dname_first, uint8_t** prev_dname_last,
|
||||
size_t* prev_dnamelen, uint16_t* prev_type,
|
||||
uint16_t* prev_dclass, struct rrset_parse** rrset_prev,
|
||||
sldns_pkt_section section, struct regional* region)
|
||||
{
|
||||
hashvalue_t dname_h = pkt_hash_rrset_first(pkt, dname);
|
||||
hashvalue_type dname_h = pkt_hash_rrset_first(pkt, dname);
|
||||
uint16_t covtype;
|
||||
if(*rrset_prev) {
|
||||
/* check if equal to previous item */
|
||||
|
@ -823,7 +824,7 @@ parse_section(sldns_buffer* pkt, struct msg_parse* msg,
|
|||
uint16_t type, prev_type = 0;
|
||||
uint16_t dclass, prev_dclass = 0;
|
||||
uint32_t rrset_flags = 0;
|
||||
hashvalue_t hash = 0;
|
||||
hashvalue_type hash = 0;
|
||||
struct rrset_parse* rrset = NULL;
|
||||
int r;
|
||||
|
||||
|
@ -933,13 +934,41 @@ parse_packet(sldns_buffer* pkt, struct msg_parse* msg, struct regional* region)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/** parse EDNS options from EDNS wireformat rdata */
|
||||
static int
|
||||
parse_edns_options(uint8_t* rdata_ptr, size_t rdata_len,
|
||||
struct edns_data* edns, struct regional* region)
|
||||
{
|
||||
/* while still more options, and have code+len to read */
|
||||
/* ignores partial content (i.e. rdata len 3) */
|
||||
while(rdata_len >= 4) {
|
||||
uint16_t opt_code = sldns_read_uint16(rdata_ptr);
|
||||
uint16_t opt_len = sldns_read_uint16(rdata_ptr+2);
|
||||
rdata_ptr += 4;
|
||||
rdata_len -= 4;
|
||||
if(opt_len > rdata_len)
|
||||
break; /* option code partial */
|
||||
if(!edns_opt_append(edns, region, opt_code, opt_len,
|
||||
rdata_ptr)) {
|
||||
log_err("out of memory");
|
||||
return 0;
|
||||
}
|
||||
rdata_ptr += opt_len;
|
||||
rdata_len -= opt_len;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
parse_extract_edns(struct msg_parse* msg, struct edns_data* edns)
|
||||
parse_extract_edns(struct msg_parse* msg, struct edns_data* edns,
|
||||
struct regional* region)
|
||||
{
|
||||
struct rrset_parse* rrset = msg->rrset_first;
|
||||
struct rrset_parse* prev = 0;
|
||||
struct rrset_parse* found = 0;
|
||||
struct rrset_parse* found_prev = 0;
|
||||
size_t rdata_len;
|
||||
uint8_t* rdata_ptr;
|
||||
/* since the class encodes the UDP size, we cannot use hash table to
|
||||
* find the EDNS OPT record. Scan the packet. */
|
||||
while(rrset) {
|
||||
|
@ -986,13 +1015,25 @@ parse_extract_edns(struct msg_parse* msg, struct edns_data* edns)
|
|||
edns->edns_version = found->rr_last->ttl_data[1];
|
||||
edns->bits = sldns_read_uint16(&found->rr_last->ttl_data[2]);
|
||||
edns->udp_size = ntohs(found->rrset_class);
|
||||
/* ignore rdata and rrsigs */
|
||||
edns->opt_list = NULL;
|
||||
|
||||
/* take the options */
|
||||
rdata_len = found->rr_first->size;
|
||||
rdata_ptr = found->rr_first->ttl_data+6;
|
||||
if(!parse_edns_options(rdata_ptr, rdata_len, edns, region))
|
||||
return 0;
|
||||
|
||||
/* ignore rrsigs */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
parse_edns_from_pkt(sldns_buffer* pkt, struct edns_data* edns)
|
||||
parse_edns_from_pkt(sldns_buffer* pkt, struct edns_data* edns,
|
||||
struct regional* region)
|
||||
{
|
||||
size_t rdata_len;
|
||||
uint8_t* rdata_ptr;
|
||||
log_assert(LDNS_QDCOUNT(sldns_buffer_begin(pkt)) == 1);
|
||||
log_assert(LDNS_ANCOUNT(sldns_buffer_begin(pkt)) == 0);
|
||||
log_assert(LDNS_NSCOUNT(sldns_buffer_begin(pkt)) == 0);
|
||||
|
@ -1017,6 +1058,36 @@ parse_edns_from_pkt(sldns_buffer* pkt, struct edns_data* edns)
|
|||
edns->ext_rcode = sldns_buffer_read_u8(pkt); /* ttl used for bits */
|
||||
edns->edns_version = sldns_buffer_read_u8(pkt);
|
||||
edns->bits = sldns_buffer_read_u16(pkt);
|
||||
/* ignore rdata and rrsigs */
|
||||
edns->opt_list = NULL;
|
||||
|
||||
/* take the options */
|
||||
rdata_len = sldns_buffer_read_u16(pkt);
|
||||
if(sldns_buffer_remaining(pkt) < rdata_len)
|
||||
return LDNS_RCODE_FORMERR;
|
||||
rdata_ptr = sldns_buffer_current(pkt);
|
||||
if(!parse_edns_options(rdata_ptr, rdata_len, edns, region))
|
||||
return LDNS_RCODE_SERVFAIL;
|
||||
|
||||
/* ignore rrsigs */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
log_edns_opt_list(enum verbosity_value level, const char* info_str,
|
||||
struct edns_option* list)
|
||||
{
|
||||
if(verbosity >= level && list) {
|
||||
char str[128], *s;
|
||||
size_t slen;
|
||||
verbose(level, "%s", info_str);
|
||||
while(list) {
|
||||
s = str;
|
||||
slen = sizeof(str);
|
||||
(void)sldns_wire2str_edns_option_print(&s, &slen, list->opt_code,
|
||||
list->opt_data, list->opt_len);
|
||||
verbose(level, " %s", str);
|
||||
list = list->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue