return true;
}
+int
+ldns_dname_compare(const ldns_rdf *dname1, const ldns_rdf *dname2)
+{
+ size_t lc1, lc2;
+ ldns_rdf *label1, *label2;
+ size_t i;
+ /* see RFC4034 for this algorithm */
+ /* this algorithm assumes the names are normalized to case */
+
+ lc1 = ldns_dname_label_count(dname1) - 1;
+ lc2 = ldns_dname_label_count(dname2) - 1;
+
+ while (true) {
+ label1 = ldns_dname_label(dname1, lc1);
+ label2 = ldns_dname_label(dname2, lc2);
+ if (ldns_rdf_size(label1) < ldns_rdf_size(label2)) {
+ return -1;
+ } else if (ldns_rdf_size(label1) > ldns_rdf_size(label2)) {
+ return 1;
+ } else {
+ for (i = 0; i < ldns_rdf_size(label1); i++) {
+ if (ldns_rdf_data(label1)[i] < ldns_rdf_data(label2)[i]) {
+ return -1;
+ } else if (ldns_rdf_data(label1)[i] > ldns_rdf_data(label2)[i]) {
+ return 1;
+ }
+ }
+ }
+ if (lc1 == 0 && lc2 > 0) {
+ return -1;
+ } else if (lc1 > 0 && lc2 == 0) {
+ return 1;
+ } else if (lc1 == 0 && lc2 == 0) {
+ return 0;
+ }
+ lc1--;
+ lc2--;
+ }
+}
+
bool
ldns_dname_str_absolute(const char *dname_str)
{
}
signed_zone_rrs = ldns_rr_list_new();
- ldns_rr_list_sort_oct(orig_zone_rrs);
+ ldns_rr_list_sort(orig_zone_rrs);
/* add nsecs */
for (i = 0; i < ldns_rr_list_rr_count(orig_zone_rrs); i++) {
+ ldns_rr_list_push_rr(signed_zone_rrs, ldns_rr_list_rr(orig_zone_rrs, i));
if (!start_dname) {
/*start_dname = ldns_rr_owner(ldns_zone_soa(zone));*/
start_dname = ldns_rr_owner(ldns_rr_list_rr(orig_zone_rrs, i));
} else {
next_rr = ldns_rr_list_rr(orig_zone_rrs, i);
next_dname = ldns_rr_owner(next_rr);
- ldns_rr_list_push_rr(signed_zone_rrs, ldns_rr_list_rr(orig_zone_rrs, i));
if (ldns_rdf_compare(cur_dname, next_dname) != 0) {
/* skip glue */
if (ldns_rr_list_contains_rr(glue_rrs, next_rr)) {
*/
bool ldns_dname_is_subdomain(const ldns_rdf *sub, const ldns_rdf *parent);
+/**
+ * Compares the two dname rdf's according to the algorithm for ordering
+ * in RFC4034 Section 6.
+ * \param[in] dname1 First dname rdf to compare
+ * \param[in] dname1 Second dname rdf to compare
+ * \return -1 if dname1 comes before dname2, 1 if dname1 comes after dname2, and 0 if they are equal.
+ */
+int ldns_dname_compare(const ldns_rdf *dname1, const ldns_rdf *dname2);
+
/**
* Checks whether the given dname string is absolute (i.e. ends with a '.')
* \param[in] *dname_str a string representing the dname
c1 = ldns_rr_get_class(rr1);
c2 = ldns_rr_get_class(rr2);
t1 = ldns_rr_get_type(rr1);
- t2 = ldns_rr_get_type(rr2);
-
+ t2 = ldns_rr_get_type(rr2);
result = strcmp(n1, n2);
if (result == 0) {
rr1_len = ldns_rr_uncompressed_size(rr1);
rr2_len = ldns_rr_uncompressed_size(rr2);
+ if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) < 0) {
+ return -1;
+ } else if (ldns_dname_compare(ldns_rr_owner(rr1), ldns_rr_owner(rr2)) > 0) {
+ return 1;
+ }
if (rr1_len < rr2_len) {
return -1;
} else if (rr1_len > rr2_len) {
*d = NULL;
len = strlen((char*)str);
- if (len > LDNS_MAX_DOMAINLEN) {
+ /* octet representation can make strings a lot longer than actual length */
+ if (len > LDNS_MAX_DOMAINLEN * 3) {
return LDNS_STATUS_DOMAINNAME_OVERFLOW;
}
if (0 == len) {