Store dnsreq->name in wire format

This commit is contained in:
Willem Toorop 2015-06-29 23:32:49 +02:00
parent 407ecffb67
commit 8d5ac3afde
7 changed files with 38 additions and 41 deletions

View File

@ -2302,8 +2302,6 @@ getdns_context_local_namespace_resolve(
{ {
getdns_context *context = dnsreq->context; getdns_context *context = dnsreq->context;
host_name_addrs *hnas; host_name_addrs *hnas;
uint8_t query_name[256];
size_t query_name_len = sizeof(query_name);
uint8_t lookup[256]; uint8_t lookup[256];
getdns_list empty_list = { 0 }; getdns_list empty_list = { 0 };
getdns_bindata bindata; getdns_bindata bindata;
@ -2321,10 +2319,7 @@ getdns_context_local_namespace_resolve(
return GETDNS_RETURN_GENERIC_ERROR; return GETDNS_RETURN_GENERIC_ERROR;
/*Do the lookup*/ /*Do the lookup*/
if (gldns_str2wire_dname_buf(dnsreq->name,query_name,&query_name_len)) (void)memcpy(lookup, dnsreq->name, dnsreq->name_len);
return GETDNS_RETURN_GENERIC_ERROR;
(void)memcpy(lookup, query_name, query_name_len);
canonicalize_dname(lookup); canonicalize_dname(lookup);
if (!(hnas = (host_name_addrs *) if (!(hnas = (host_name_addrs *)
@ -2340,8 +2335,8 @@ getdns_context_local_namespace_resolve(
if (!(*response = getdns_dict_create_with_context(context))) if (!(*response = getdns_dict_create_with_context(context)))
return GETDNS_RETURN_GENERIC_ERROR; return GETDNS_RETURN_GENERIC_ERROR;
bindata.size = query_name_len; bindata.size = dnsreq->name_len;
bindata.data = query_name; bindata.data = dnsreq->name;
if (getdns_dict_set_bindata(*response, "canonical_name", &bindata)) if (getdns_dict_set_bindata(*response, "canonical_name", &bindata))
goto error; goto error;

View File

@ -1760,7 +1760,7 @@ static void add_netreq2val_chain(
if (GLDNS_ANCOUNT(netreq->response) == 0 && if (GLDNS_ANCOUNT(netreq->response) == 0 &&
GLDNS_NSCOUNT(netreq->response) == 0) { GLDNS_NSCOUNT(netreq->response) == 0) {
empty_rrset.name = netreq->query + GLDNS_HEADER_SIZE; empty_rrset.name = netreq->owner->name;
empty_rrset.rr_class = GETDNS_RRCLASS_IN; empty_rrset.rr_class = GETDNS_RRCLASS_IN;
empty_rrset.rr_type = 0; empty_rrset.rr_type = 0;
empty_rrset.pkt = netreq->response; empty_rrset.pkt = netreq->response;
@ -1798,7 +1798,7 @@ static void add_netreq2val_chain(
*/ */
/* First find the canonical name for the question */ /* First find the canonical name for the question */
q_rrset.name = netreq->query + GLDNS_HEADER_SIZE; q_rrset.name = netreq->owner->name;
q_rrset.rr_type = GETDNS_RRTYPE_CNAME; q_rrset.rr_type = GETDNS_RRTYPE_CNAME;
q_rrset.rr_class = netreq->request_class; q_rrset.rr_class = netreq->request_class;
q_rrset.pkt = netreq->response; q_rrset.pkt = netreq->response;

View File

@ -39,6 +39,7 @@
#include <string.h> #include <string.h>
#include <unbound.h> #include <unbound.h>
#include "config.h" #include "config.h"
#include "gldns/wire2str.h"
#include "context.h" #include "context.h"
#include "types-internal.h" #include "types-internal.h"
#include "util-internal.h" #include "util-internal.h"
@ -136,6 +137,7 @@ submit_network_request(getdns_network_req *netreq)
{ {
getdns_return_t r; getdns_return_t r;
getdns_dns_req *dns_req = netreq->owner; getdns_dns_req *dns_req = netreq->owner;
char name[1024];
if (dns_req->context->resolution_type == GETDNS_RESOLUTION_RECURSING if (dns_req->context->resolution_type == GETDNS_RESOLUTION_RECURSING
/* TODO: Until DNSSEC with the new async stub resolver is finished, /* TODO: Until DNSSEC with the new async stub resolver is finished,
@ -159,9 +161,11 @@ submit_network_request(getdns_network_req *netreq)
dns_req->context->timeout, &dns_req->timeout))) dns_req->context->timeout, &dns_req->timeout)))
return r; return r;
} }
(void) gldns_wire2str_dname_buf(dns_req->name,
dns_req->name_len, name, sizeof(name));
return ub_resolve_async(dns_req->context->unbound_ctx, return ub_resolve_async(dns_req->context->unbound_ctx,
dns_req->name, netreq->request_type, netreq->request_class, name, netreq->request_type, netreq->request_class,
netreq, ub_resolve_callback, &(netreq->unbound_id)) ? netreq, ub_resolve_callback, &(netreq->unbound_id)) ?
GETDNS_RETURN_GENERIC_ERROR : GETDNS_RETURN_GOOD; GETDNS_RETURN_GENERIC_ERROR : GETDNS_RETURN_GOOD;
} }

View File

@ -203,8 +203,6 @@ dns_req_free(getdns_dns_req * req)
req->timeout.timeout_cb = NULL; req->timeout.timeout_cb = NULL;
} }
/* free strduped name */
GETDNS_FREE(req->my_mf, req->name);
GETDNS_FREE(req->my_mf, req); GETDNS_FREE(req->my_mf, req);
} }
@ -358,7 +356,12 @@ dns_req_new(getdns_context *context, getdns_eventloop *loop,
result->netreqs[1] = NULL; result->netreqs[1] = NULL;
result->my_mf = context->mf; result->my_mf = context->mf;
result->name = getdns_strdup(&(result->my_mf), name);
result->name_len = sizeof(result->name);
if (gldns_str2wire_dname_buf(name, result->name, &result->name_len)) {
GETDNS_FREE(result->my_mf, result);
return NULL;
}
result->context = context; result->context = context;
result->loop = loop; result->loop = loop;
result->canceled = 0; result->canceled = 0;

View File

@ -272,10 +272,10 @@ is_starttls_response(getdns_network_req *netreq)
priv_getdns_rdf_iter rdf_iter_storage, *rdf_iter; priv_getdns_rdf_iter rdf_iter_storage, *rdf_iter;
uint16_t rr_type; uint16_t rr_type;
gldns_pkt_section section; gldns_pkt_section section;
uint8_t starttls_name_space[256], uint8_t starttls_name_space[256], *starttls_name;
*starttls_name = starttls_name_space;
uint8_t owner_name_space[256], *owner_name; uint8_t owner_name_space[256], *owner_name;
size_t starttls_name_len = 256, owner_name_len; size_t starttls_name_len = sizeof(starttls_name_space);
size_t owner_name_len = sizeof(owner_name_space);;
/* Servers that are not STARTTLS aware will refuse the CH query*/ /* Servers that are not STARTTLS aware will refuse the CH query*/
if (GLDNS_RCODE_NOERROR != GLDNS_RCODE_WIRE(netreq->response)) if (GLDNS_RCODE_NOERROR != GLDNS_RCODE_WIRE(netreq->response))
@ -284,9 +284,6 @@ is_starttls_response(getdns_network_req *netreq)
if (GLDNS_ANCOUNT(netreq->response) != 1) if (GLDNS_ANCOUNT(netreq->response) != 1)
return 0; return 0;
(void) gldns_str2wire_dname_buf(
netreq->owner->name, starttls_name_space, &starttls_name_len);
for ( rr_iter = priv_getdns_rr_iter_init(&rr_iter_storage for ( rr_iter = priv_getdns_rr_iter_init(&rr_iter_storage
, netreq->response , netreq->response
, netreq->response_len) , netreq->response_len)
@ -295,25 +292,25 @@ is_starttls_response(getdns_network_req *netreq)
section = priv_getdns_rr_iter_section(rr_iter); section = priv_getdns_rr_iter_section(rr_iter);
rr_type = gldns_read_uint16(rr_iter->rr_type); rr_type = gldns_read_uint16(rr_iter->rr_type);
if (section != GLDNS_SECTION_ANSWER || rr_type != GETDNS_RRTYPE_TXT) if (section != GLDNS_SECTION_ANSWER
|| rr_type != GETDNS_RRTYPE_TXT)
continue; continue;
owner_name = priv_getdns_owner_if_or_as_decompressed( owner_name = priv_getdns_owner_if_or_as_decompressed(
rr_iter, owner_name_space, &owner_name_len); rr_iter, owner_name_space, &owner_name_len);
if (!priv_getdns_dname_equal(starttls_name, owner_name)) if (!priv_getdns_dname_equal(netreq->owner->name, owner_name))
continue; continue;
if (!(rdf_iter = priv_getdns_rdf_iter_init( if (!(rdf_iter = priv_getdns_rdf_iter_init(
&rdf_iter_storage, rr_iter))) &rdf_iter_storage, rr_iter)))
continue; continue;
/* re-use the starttls_name for the response dname*/
starttls_name = priv_getdns_rdf_if_or_as_decompressed( if ((starttls_name = priv_getdns_rdf_if_or_as_decompressed(
rdf_iter,starttls_name_space,&starttls_name_len); rdf_iter, starttls_name_space, &starttls_name_len)) &&
if (priv_getdns_dname_equal(starttls_name, owner_name)) priv_getdns_dname_equal(starttls_name, owner_name))
return 1; return 1;
else
return 0; return 0;
continue;
} }
return 0; return 0;
} }

View File

@ -237,7 +237,8 @@ typedef struct getdns_dns_req {
getdns_rbnode_t node; getdns_rbnode_t node;
/* name */ /* name */
char *name; uint8_t name[256];
size_t name_len;
/* canceled flag */ /* canceled flag */
int canceled; int canceled;

View File

@ -544,8 +544,7 @@ priv_getdns_create_reply_dict(getdns_context *context, getdns_network_req *req,
if ((r = getdns_dict_set_dict(result, "header", header))) if ((r = getdns_dict_set_dict(result, "header", header)))
goto error; goto error;
(void) gldns_str2wire_dname_buf( canonical_name = req->owner->name;
req->owner->name, canonical_name_space, &canonical_name_len);
for ( rr_iter = priv_getdns_rr_iter_init(&rr_iter_storage for ( rr_iter = priv_getdns_rr_iter_init(&rr_iter_storage
, req->response , req->response
@ -863,8 +862,6 @@ getdns_return_t
getdns_apply_network_result(getdns_network_req* netreq, getdns_apply_network_result(getdns_network_req* netreq,
struct ub_result* ub_res) struct ub_result* ub_res)
{ {
size_t dname_len;
if (ub_res->bogus) if (ub_res->bogus)
netreq->dnssec_status = GETDNS_DNSSEC_BOGUS; netreq->dnssec_status = GETDNS_DNSSEC_BOGUS;
else if (ub_res->secure) else if (ub_res->secure)
@ -909,17 +906,17 @@ getdns_apply_network_result(getdns_network_req* netreq,
GLDNS_RA_SET(netreq->response); GLDNS_RA_SET(netreq->response);
GLDNS_RCODE_SET(netreq->response, ub_res->rcode); GLDNS_RCODE_SET(netreq->response, ub_res->rcode);
dname_len = netreq->max_udp_payload_size - GLDNS_HEADER_SIZE; (void) memcpy( netreq->response + GLDNS_HEADER_SIZE
if (gldns_str2wire_dname_buf(netreq->owner->name, , netreq->owner->name, netreq->owner->name_len);
netreq->response + GLDNS_HEADER_SIZE, &dname_len))
return GETDNS_RETURN_GENERIC_ERROR;
gldns_write_uint16( netreq->response + GLDNS_HEADER_SIZE + dname_len gldns_write_uint16( netreq->response + GLDNS_HEADER_SIZE
+ netreq->owner->name_len
, netreq->request_type); , netreq->request_type);
gldns_write_uint16( netreq->response + GLDNS_HEADER_SIZE + dname_len + 2 gldns_write_uint16( netreq->response + GLDNS_HEADER_SIZE
+ netreq->owner->name_len + 2
, netreq->request_class); , netreq->request_class);
netreq->response_len = GLDNS_HEADER_SIZE + dname_len + 4; netreq->response_len = GLDNS_HEADER_SIZE + netreq->owner->name_len + 4;
return GETDNS_RETURN_GOOD; return GETDNS_RETURN_GOOD;
} }