mirror of
https://github.com/NLnetLabs/unbound.git
synced 2026-02-18 18:25:10 -05:00
Fixed bug where lame delegation was returned
This commit is contained in:
parent
c6ce5d9652
commit
6fe6f673ad
1 changed files with 45 additions and 42 deletions
|
|
@ -2585,17 +2585,19 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
|
|||
iq->deleg_original_qname = (uint8_t *)regional_alloc(qstate->region, iq->qchase.qname_len + 1);
|
||||
memcpy(iq->deleg_original_qname, qstate->qinfo.qname, iq->qchase.qname_len);
|
||||
iq->deleg_original_qname_len = iq->qchase.qname_len;
|
||||
log_err("JESSE: Copied original qname: %s", iq->deleg_original_qname);
|
||||
// log_err("JESSE: Copied original qname: %s", iq->deleg_original_qname);
|
||||
iq->original_query = iq->qchase.qtype;
|
||||
} else {
|
||||
//restore qname to original to put _deleg in correct point
|
||||
memcpy(qstate->qinfo.qname, iq->deleg_original_qname, iq->deleg_original_qname_len);
|
||||
memcpy(iq->qchase.qname, iq->deleg_original_qname, iq->deleg_original_qname_len);
|
||||
iq->qchase.qname_len = iq->deleg_original_qname_len;
|
||||
iq->qchase.qtype = iq->original_query;
|
||||
iq->qinfo_out.qtype = iq->original_query;
|
||||
}
|
||||
//NICE point
|
||||
//root len check not needed anymore TODO
|
||||
log_err("JESSE: Current delegation state: %d", iq->deleg_state);
|
||||
// log_err("JESSE: Current delegation state: %d", iq->deleg_state);
|
||||
if (iq->deleg_state == 0 && root_len > 0) {
|
||||
iq->deleg_original_qname_len = iq->qchase.qname_len;
|
||||
iq->deleg_state = 1;
|
||||
|
|
@ -2603,42 +2605,42 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
|
|||
|
||||
// iq->deleg_original_qname = qstate->qinfo.qname;
|
||||
|
||||
log_err("JESSE: Current delegation point: %s", iq->dp->name);
|
||||
// log_err("JESSE: Current delegation point: %s", iq->dp->name);
|
||||
// int delegation_labels_len = dname_count_labels(iq->dp->name);
|
||||
log_err("JESSE: Current delegation point amount labels: %d", iq->dp->namelabs);
|
||||
// log_err("JESSE: Current delegation point amount labels: %d", iq->dp->namelabs);
|
||||
int qchase_label_len = dname_count_labels(iq->qchase.qname);
|
||||
log_err("JESSE: Current qchase amount labels: %d", qchase_label_len);
|
||||
// log_err("JESSE: Current qchase amount labels: %d", qchase_label_len);
|
||||
// int labdiff = qchaselabs - dname_count_labels(iq->qinfo_out.qname);
|
||||
log_err("JESSE: qchase before label removing: %s", iq->qchase.qname);
|
||||
// log_err("JESSE: qchase before label removing: %s", iq->qchase.qname);
|
||||
size_t labdiff = qchase_label_len - iq->dp->namelabs - 1;
|
||||
dname_remove_labels(&iq->qchase.qname, &iq->qchase.qname_len, labdiff);
|
||||
log_err("JESSE: qchase after label removing: %s", iq->qchase.qname);
|
||||
// log_err("JESSE: qchase after label removing: %s", iq->qchase.qname);
|
||||
|
||||
//we have to add _deleg after the first label
|
||||
//for ex. jesse.nlnetlabs.nl becomes jesse._deleg.nlnetlabs.nl
|
||||
uint8_t deleg_wireformat[] = {6, 95, 100, 101, 108, 101, 103}; //{06}_deleg
|
||||
size_t delnamelen = iq->qchase.qname_len + sizeof(deleg_wireformat);
|
||||
log_err("deleg wireformat size: %d, original qname size: %d, qname len (variable): %d, size of first label orginal qname: %d allocated space: %d", sizeof(deleg_wireformat), sizeof(iq->qchase.qname), iq->qchase.qname_len, iq->qchase.qname[0], delnamelen);
|
||||
// log_err("deleg wireformat size: %d, original qname size: %d, qname len (variable): %d, size of first label orginal qname: %d allocated space: %d", sizeof(deleg_wireformat), sizeof(iq->qchase.qname), iq->qchase.qname_len, iq->qchase.qname[0], delnamelen);
|
||||
// delnamelen = iq->qchase.qname_len + sizeof(deleg_wireformat);
|
||||
// delname = (uint8_t *)malloc(delnamelen);
|
||||
uint8_t *delname = (uint8_t *)regional_alloc(qstate->region, delnamelen);
|
||||
//put first label of original qname
|
||||
uint8_t first_label_len = iq->qchase.qname[0];
|
||||
log_err("First label length: %d", first_label_len);
|
||||
// log_err("First label length: %d", first_label_len);
|
||||
uint8_t *qname_minus_first_label = iq->qchase.qname + first_label_len + 1;
|
||||
uint8_t leftover_len = iq->qchase.qname_len - first_label_len - 1;
|
||||
// memcpy(delname, iq->qchase.qname, sizeof(iq->qchase.qname)); //memcpy 1st label into delname
|
||||
memcpy(delname, iq->qchase.qname, first_label_len + 1); //memcpy 1st label into delname
|
||||
memcpy(delname + first_label_len + 1, deleg_wireformat, sizeof(deleg_wireformat)); //memcpy _deleg label in delname
|
||||
memcpy(delname + first_label_len + sizeof(deleg_wireformat) + 1, qname_minus_first_label, leftover_len); //memcpy other labels in delname
|
||||
log_err("Old delegation point: %s", iq->qchase.qname);
|
||||
log_err("cname without first label: %s", qname_minus_first_label);
|
||||
// log_err("Old delegation point: %s", iq->qchase.qname);
|
||||
// log_err("cname without first label: %s", qname_minus_first_label);
|
||||
// log_err("delegation name in bytes:");
|
||||
// for (size_t i = 0; i < delnamelen; ++i) {
|
||||
// log_err("%u ", delname[i]);
|
||||
// }
|
||||
|
||||
log_err("The _deleg delegation point: %s", delname);
|
||||
// log_err("The _deleg delegation point: %s", delname);
|
||||
|
||||
|
||||
iq->dp->namelen = delnamelen;
|
||||
|
|
@ -3155,8 +3157,8 @@ processQueryTargets(struct module_qstate* qstate, struct iter_qstate* iq,
|
|||
iq->dp->name, &real_addr, real_addrlen);
|
||||
}
|
||||
// @JESSE: This is where a query is finally going out, hopefully.
|
||||
log_err("JESSE send qname: %s", qstate->qinfo.qname);
|
||||
log_err("JESSE send type: %d", qstate->qinfo.qtype);
|
||||
// log_err("JESSE send qname: %s", qstate->qinfo.qname);
|
||||
// log_err("JESSE send type: %d", qstate->qinfo.qtype);
|
||||
|
||||
fptr_ok(fptr_whitelist_modenv_send_query(qstate->env->send_query));
|
||||
outq = (*qstate->env->send_query)(&iq->qinfo_out,
|
||||
|
|
@ -3312,22 +3314,23 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
|
|||
/* handle each of the type cases */
|
||||
//check deleg and change to referal type TODO add check to see if _deleg in name
|
||||
uint16_t SVCB_QTYPE = 64;
|
||||
log_err("JESSE: the qtype of the answer is: %d ", iq->qchase.qtype);
|
||||
log_err("JESSE: the type is: %d", type);
|
||||
// log_err("JESSE: the qtype of the answer is: %d ", iq->qchase.qtype);
|
||||
// log_err("JESSE: the type is: %d", type);
|
||||
|
||||
//check wether it was a deleg query
|
||||
uint8_t deleg_wireformat[] = {6, 95, 100, 101, 108, 101, 103}; //{06}_deleg
|
||||
uint8_t first_label_len = iq->qchase.qname[0];
|
||||
int is_deleg_query = memcmp(iq->qchase.qname + first_label_len + 1, deleg_wireformat, 7);
|
||||
for (size_t i = 0; i < 7; ++i) {
|
||||
log_err("%u ", iq->qchase.qname[i+ first_label_len]);
|
||||
}
|
||||
// for (size_t i = 0; i < 7; ++i) {
|
||||
// log_err("%u ", iq->qchase.qname[i+ first_label_len]);
|
||||
// }
|
||||
|
||||
log_err("JESSE: is deleg query: %d", is_deleg_query);
|
||||
// log_err("JESSE: is deleg query: %d", is_deleg_query);
|
||||
|
||||
if (iq->deleg_state == 1 && type == RESPONSE_TYPE_ANSWER && iq->qchase.qtype == 64 && (is_deleg_query == 0)) {
|
||||
if (iq->deleg_state == 1 && type == RESPONSE_TYPE_ANSWER && iq->qchase.qtype == 64 && is_deleg_query == 0) {
|
||||
//or lame respone?
|
||||
if (FLAGS_GET_RCODE(iq->response->rep->flags) == LDNS_RCODE_NXDOMAIN) {
|
||||
log_err("JESSE: got into the else!!!");
|
||||
// log_err("JESSE: got into the else!!!");
|
||||
// iq->deleg_state = 2;
|
||||
// log_err("Is the ns resolved: %d", iq->dp->nslist[0].resolved);
|
||||
// iq->dp->nslist[0].resolved = 0;
|
||||
|
|
@ -3344,7 +3347,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
|
|||
}
|
||||
iq->deleg_state = 0;
|
||||
struct ub_packed_rrset_key* rrset_key;
|
||||
log_err("JESSE: the returnmsg: %s", iq->response->rep);
|
||||
// log_err("JESSE: the returnmsg: %s", iq->response->rep);
|
||||
rrset_key = reply_find_answer_rrset(&iq->qchase, iq->response->rep);
|
||||
// struct packed_rrset_key rr_records = rrset->rk;
|
||||
|
||||
|
|
@ -3353,7 +3356,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
|
|||
|
||||
size_t data_len = rrset_data->rr_len[0];
|
||||
uint8_t* svcb_data = rrset_data->rr_data[0];
|
||||
log_err("JESSE: The wireformat SVCB name:");
|
||||
// log_err("JESSE: The wireformat SVCB name:");
|
||||
for (size_t i = 0; i < data_len; ++i) {
|
||||
log_err("%u ", svcb_data[i]);
|
||||
}
|
||||
|
|
@ -3368,23 +3371,23 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
|
|||
while(index < data_len && (ipv4 == NULL || ipv6 == NULL)) {
|
||||
uint16_t svcParamkey = (svcb_data[index] << 8) | svcb_data[index+1];
|
||||
uint16_t svcParamValLen = (svcb_data[index+2] << 8) | svcb_data[index+3];
|
||||
log_err("scvparamkey: %d", svcParamkey);
|
||||
log_err("scvparamlength: %d", svcParamValLen);
|
||||
// log_err("scvparamkey: %d", svcParamkey);
|
||||
// log_err("scvparamlength: %d", svcParamValLen);
|
||||
index = index + 4;
|
||||
if (svcParamkey == 4) { //parse IPv4
|
||||
ipv4 = (uint8_t *)regional_alloc(qstate->region, 4 * sizeof(uint8_t));
|
||||
memcpy(ipv4, svcb_data + index, 4);
|
||||
log_err("Parsed IPv4 Hint:");
|
||||
for (size_t i = 0; i < 4; ++i) {
|
||||
log_err("%u ", ipv4[i]);
|
||||
}
|
||||
// log_err("Parsed IPv4 Hint:");
|
||||
// for (size_t i = 0; i < 4; ++i) {
|
||||
// log_err("%u ", ipv4[i]);
|
||||
// }
|
||||
} else if (svcParamkey == 6) { //parse ipv6
|
||||
ipv6 = (uint8_t *)regional_alloc(qstate->region, 16 * sizeof(uint8_t));
|
||||
memcpy(ipv6, svcb_data + index, 16);
|
||||
log_err("Parsed IPv6 Hint:");
|
||||
for (size_t i = 0; i < 16; ++i) {
|
||||
log_err("%u ", ipv6[i]);
|
||||
}
|
||||
// log_err("Parsed IPv6 Hint:");
|
||||
// for (size_t i = 0; i < 16; ++i) {
|
||||
// log_err("%u ", ipv6[i]);
|
||||
// }
|
||||
}
|
||||
index = index + svcParamValLen;
|
||||
// iq->deleg_state = 0;
|
||||
|
|
@ -3398,18 +3401,18 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
|
|||
size_t new_delegation_label_count = dname_count_labels(rrset_key->rk.dname);
|
||||
size_t old_label_count = dname_count_labels(iq->deleg_original_qname);
|
||||
size_t diff_label_len = old_label_count - new_delegation_label_count + 1;
|
||||
log_err("old label: %s", iq->deleg_original_qname);
|
||||
log_err("old label count: %d", old_label_count);
|
||||
log_err("new label count: %d", new_delegation_label_count);
|
||||
log_err("new label: %s", rrset_key->rk.dname);
|
||||
// log_err("old label: %s", iq->deleg_original_qname);
|
||||
// log_err("old label count: %d", old_label_count);
|
||||
// log_err("new label count: %d", new_delegation_label_count);
|
||||
// log_err("new label: %s", rrset_key->rk.dname);
|
||||
|
||||
uint8_t *new_delegation_name = (uint8_t *)regional_alloc(qstate->region, iq->deleg_original_qname_len);
|
||||
size_t new_delegation_name_len = iq->deleg_original_qname_len;
|
||||
memcpy(new_delegation_name, iq->deleg_original_qname, iq->deleg_original_qname_len);
|
||||
log_err("JESSE: Amount of labels to remove %d", diff_label_len);
|
||||
log_err("JESSE: Newly created delegation point before removing: %s", new_delegation_name);
|
||||
// log_err("JESSE: Amount of labels to remove %d", diff_label_len);
|
||||
// log_err("JESSE: Newly created delegation point before removing: %s", new_delegation_name);
|
||||
dname_remove_labels(&new_delegation_name, &new_delegation_name_len, diff_label_len);
|
||||
log_err("JESSE: Newly created delegation point after removing: %s", new_delegation_name);
|
||||
// log_err("JESSE: Newly created delegation point after removing: %s", new_delegation_name);
|
||||
|
||||
// uint8_t deleg_label_len = 7;
|
||||
// uint8_t new_delegation_name_len = rrset_key->rk.dname_len - deleg_label_len;
|
||||
|
|
@ -3898,7 +3901,7 @@ processQueryResponse(struct module_qstate* qstate, struct iter_qstate* iq,
|
|||
* In this case, the event is just sent directly back to
|
||||
* the QUERYTARGETS_STATE without resetting anything,
|
||||
* because, clearly, the next target must be tried. */
|
||||
log_err("JESSE: the qtype of the THROWAWAY is: %d ", iq->qchase.qtype);
|
||||
// log_err("JESSE: the qtype of the THROWAWAY is: %d ", iq->qchase.qtype);
|
||||
iq->qchase.qname = iq->deleg_original_qname;
|
||||
iq->qchase.qtype = iq->original_query;
|
||||
iq->qchase.qname_len = iq->deleg_original_qname_len;
|
||||
|
|
|
|||
Loading…
Reference in a new issue