mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-01 06:55:30 +00:00
dns_name_fromregion() now stops conversion after encountering a root label.
This commit is contained in:
@@ -332,6 +332,11 @@ void dns_name_fromregion(dns_name_t *name, dns_region_t *r);
|
|||||||
/*
|
/*
|
||||||
* Make 'name' refer to region 'r'.
|
* Make 'name' refer to region 'r'.
|
||||||
*
|
*
|
||||||
|
* Note:
|
||||||
|
* If the conversion encounters a root label before the end of the
|
||||||
|
* region the conversion stops and the length is set to the length
|
||||||
|
* so far converted.
|
||||||
|
*
|
||||||
* Requires:
|
* Requires:
|
||||||
* The data in 'r' is a sequence of one or more type 00 or type 01000001
|
* The data in 'r' is a sequence of one or more type 00 or type 01000001
|
||||||
* labels.
|
* labels.
|
||||||
|
@@ -115,7 +115,7 @@ static struct dns_name root = { "", 1, 1 };
|
|||||||
|
|
||||||
dns_name_t *dns_rootname = &root;
|
dns_name_t *dns_rootname = &root;
|
||||||
|
|
||||||
static void set_offsets(dns_name_t *, dns_boolean_t);
|
static void set_offsets(dns_name_t *, dns_boolean_t, dns_boolean_t);
|
||||||
static void compact(dns_name_t *);
|
static void compact(dns_name_t *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -467,7 +467,7 @@ dns_name_getlabelsequence(dns_name_t *source,
|
|||||||
source->offsets[first];
|
source->offsets[first];
|
||||||
target->labels = n;
|
target->labels = n;
|
||||||
|
|
||||||
set_offsets(target, DNS_FALSE);
|
set_offsets(target, DNS_FALSE, DNS_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -484,7 +484,7 @@ dns_name_fromregion(dns_name_t *name, dns_region_t *r) {
|
|||||||
name->length = r->length;
|
name->length = r->length;
|
||||||
|
|
||||||
if (r->length > 0)
|
if (r->length > 0)
|
||||||
set_offsets(name, DNS_TRUE);
|
set_offsets(name, DNS_TRUE, DNS_TRUE);
|
||||||
else
|
else
|
||||||
name->labels = 0;
|
name->labels = 0;
|
||||||
}
|
}
|
||||||
@@ -946,7 +946,7 @@ dns_name_fromtext(dns_name_t *name, dns_region_t *source,
|
|||||||
/*
|
/*
|
||||||
* We should build the offsets table directly.
|
* We should build the offsets table directly.
|
||||||
*/
|
*/
|
||||||
set_offsets(name, DNS_FALSE);
|
set_offsets(name, DNS_FALSE, DNS_FALSE);
|
||||||
|
|
||||||
if (saw_bitstring)
|
if (saw_bitstring)
|
||||||
compact(name);
|
compact(name);
|
||||||
@@ -1111,7 +1111,8 @@ dns_name_totext(dns_name_t *name, dns_boolean_t omit_final_dot,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_offsets(dns_name_t *name, dns_boolean_t set_labels) {
|
set_offsets(dns_name_t *name, dns_boolean_t set_labels,
|
||||||
|
dns_boolean_t set_length) {
|
||||||
unsigned int offset, count, nlabels, nrem, n;
|
unsigned int offset, count, nlabels, nrem, n;
|
||||||
unsigned char *ndata;
|
unsigned char *ndata;
|
||||||
|
|
||||||
@@ -1125,6 +1126,8 @@ set_offsets(dns_name_t *name, dns_boolean_t set_labels) {
|
|||||||
count = *ndata++;
|
count = *ndata++;
|
||||||
nrem--;
|
nrem--;
|
||||||
offset++;
|
offset++;
|
||||||
|
if (count == 0)
|
||||||
|
break;
|
||||||
if (count > 63) {
|
if (count > 63) {
|
||||||
INSIST(count == DNS_LABELTYPE_BITSTRING);
|
INSIST(count == DNS_LABELTYPE_BITSTRING);
|
||||||
INSIST(nrem != 0);
|
INSIST(nrem != 0);
|
||||||
@@ -1145,6 +1148,8 @@ set_offsets(dns_name_t *name, dns_boolean_t set_labels) {
|
|||||||
}
|
}
|
||||||
if (set_labels)
|
if (set_labels)
|
||||||
name->labels = nlabels;
|
name->labels = nlabels;
|
||||||
|
if (set_length)
|
||||||
|
name->length = offset;
|
||||||
INSIST(nlabels == name->labels);
|
INSIST(nlabels == name->labels);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1285,5 +1290,5 @@ compact(dns_name_t *name) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
n--;
|
n--;
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user