mirror of
https://github.com/systemd/systemd.git
synced 2025-02-06 01:57:47 +03:00
resolved: add macro to compare sized fields
For consistency, generic.size is renamed to generic.data_size. nsec3.next_hashed_name comparison was missing a size check.
This commit is contained in:
parent
ba82da3bb5
commit
a43a068a30
@ -1079,7 +1079,7 @@ int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, size_t *star
|
|||||||
case _DNS_TYPE_INVALID: /* unparseable */
|
case _DNS_TYPE_INVALID: /* unparseable */
|
||||||
default:
|
default:
|
||||||
|
|
||||||
r = dns_packet_append_blob(p, rr->generic.data, rr->generic.size, NULL);
|
r = dns_packet_append_blob(p, rr->generic.data, rr->generic.data_size, NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
@ -2022,7 +2022,7 @@ int dns_packet_read_rr(DnsPacket *p, DnsResourceRecord **ret, bool *ret_cache_fl
|
|||||||
case DNS_TYPE_OPENPGPKEY:
|
case DNS_TYPE_OPENPGPKEY:
|
||||||
default:
|
default:
|
||||||
unparseable:
|
unparseable:
|
||||||
r = dns_packet_read_memdup(p, rdlength, &rr->generic.data, &rr->generic.size, NULL);
|
r = dns_packet_read_memdup(p, rdlength, &rr->generic.data, &rr->generic.data_size, NULL);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
break;
|
break;
|
||||||
@ -2064,7 +2064,7 @@ static bool opt_is_good(DnsResourceRecord *rr, bool *rfc6975) {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
p = rr->opt.data;
|
p = rr->opt.data;
|
||||||
l = rr->opt.size;
|
l = rr->opt.data_size;
|
||||||
while (l > 0) {
|
while (l > 0) {
|
||||||
uint16_t option_code, option_length;
|
uint16_t option_code, option_length;
|
||||||
|
|
||||||
|
@ -571,6 +571,10 @@ int dns_resource_record_new_address(DnsResourceRecord **ret, int family, const u
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define FIELD_EQUAL(a, b, field) \
|
||||||
|
((a).field ## _size == (b).field ## _size && \
|
||||||
|
memcmp((a).field, (b).field, (a).field ## _size) == 0)
|
||||||
|
|
||||||
int dns_resource_record_equal(const DnsResourceRecord *a, const DnsResourceRecord *b) {
|
int dns_resource_record_equal(const DnsResourceRecord *a, const DnsResourceRecord *b) {
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
@ -652,36 +656,30 @@ int dns_resource_record_equal(const DnsResourceRecord *a, const DnsResourceRecor
|
|||||||
return a->ds.key_tag == b->ds.key_tag &&
|
return a->ds.key_tag == b->ds.key_tag &&
|
||||||
a->ds.algorithm == b->ds.algorithm &&
|
a->ds.algorithm == b->ds.algorithm &&
|
||||||
a->ds.digest_type == b->ds.digest_type &&
|
a->ds.digest_type == b->ds.digest_type &&
|
||||||
a->ds.digest_size == b->ds.digest_size &&
|
FIELD_EQUAL(a->ds, b->ds, digest);
|
||||||
memcmp(a->ds.digest, b->ds.digest, a->ds.digest_size) == 0;
|
|
||||||
|
|
||||||
case DNS_TYPE_SSHFP:
|
case DNS_TYPE_SSHFP:
|
||||||
return a->sshfp.algorithm == b->sshfp.algorithm &&
|
return a->sshfp.algorithm == b->sshfp.algorithm &&
|
||||||
a->sshfp.fptype == b->sshfp.fptype &&
|
a->sshfp.fptype == b->sshfp.fptype &&
|
||||||
a->sshfp.fingerprint_size == b->sshfp.fingerprint_size &&
|
FIELD_EQUAL(a->sshfp, b->sshfp, fingerprint);
|
||||||
memcmp(a->sshfp.fingerprint, b->sshfp.fingerprint, a->sshfp.fingerprint_size) == 0;
|
|
||||||
|
|
||||||
case DNS_TYPE_DNSKEY:
|
case DNS_TYPE_DNSKEY:
|
||||||
return a->dnskey.flags == b->dnskey.flags &&
|
return a->dnskey.flags == b->dnskey.flags &&
|
||||||
a->dnskey.protocol == b->dnskey.protocol &&
|
a->dnskey.protocol == b->dnskey.protocol &&
|
||||||
a->dnskey.algorithm == b->dnskey.algorithm &&
|
a->dnskey.algorithm == b->dnskey.algorithm &&
|
||||||
a->dnskey.key_size == b->dnskey.key_size &&
|
FIELD_EQUAL(a->dnskey, b->dnskey, key);
|
||||||
memcmp(a->dnskey.key, b->dnskey.key, a->dnskey.key_size) == 0;
|
|
||||||
|
|
||||||
case DNS_TYPE_RRSIG:
|
case DNS_TYPE_RRSIG:
|
||||||
/* do the fast comparisons first */
|
/* do the fast comparisons first */
|
||||||
if (a->rrsig.type_covered != b->rrsig.type_covered ||
|
return a->rrsig.type_covered == b->rrsig.type_covered &&
|
||||||
a->rrsig.algorithm != b->rrsig.algorithm ||
|
a->rrsig.algorithm == b->rrsig.algorithm &&
|
||||||
a->rrsig.labels != b->rrsig.labels ||
|
a->rrsig.labels == b->rrsig.labels &&
|
||||||
a->rrsig.original_ttl != b->rrsig.original_ttl ||
|
a->rrsig.original_ttl == b->rrsig.original_ttl &&
|
||||||
a->rrsig.expiration != b->rrsig.expiration ||
|
a->rrsig.expiration == b->rrsig.expiration &&
|
||||||
a->rrsig.inception != b->rrsig.inception ||
|
a->rrsig.inception == b->rrsig.inception &&
|
||||||
a->rrsig.key_tag != b->rrsig.key_tag ||
|
a->rrsig.key_tag == b->rrsig.key_tag &&
|
||||||
a->rrsig.signature_size != b->rrsig.signature_size ||
|
FIELD_EQUAL(a->rrsig, b->rrsig, signature) &&
|
||||||
memcmp(a->rrsig.signature, b->rrsig.signature, a->rrsig.signature_size) != 0)
|
dns_name_equal(a->rrsig.signer, b->rrsig.signer);
|
||||||
return false;
|
|
||||||
|
|
||||||
return dns_name_equal(a->rrsig.signer, b->rrsig.signer);
|
|
||||||
|
|
||||||
case DNS_TYPE_NSEC:
|
case DNS_TYPE_NSEC:
|
||||||
return dns_name_equal(a->nsec.next_domain_name, b->nsec.next_domain_name) &&
|
return dns_name_equal(a->nsec.next_domain_name, b->nsec.next_domain_name) &&
|
||||||
@ -689,23 +687,20 @@ int dns_resource_record_equal(const DnsResourceRecord *a, const DnsResourceRecor
|
|||||||
|
|
||||||
case DNS_TYPE_NSEC3:
|
case DNS_TYPE_NSEC3:
|
||||||
return a->nsec3.algorithm == b->nsec3.algorithm &&
|
return a->nsec3.algorithm == b->nsec3.algorithm &&
|
||||||
a->nsec3.flags == b->nsec3.flags &&
|
a->nsec3.flags == b->nsec3.flags &&
|
||||||
a->nsec3.iterations == b->nsec3.iterations &&
|
a->nsec3.iterations == b->nsec3.iterations &&
|
||||||
a->nsec3.salt_size == b->nsec3.salt_size &&
|
FIELD_EQUAL(a->nsec3, b->nsec3, salt) &&
|
||||||
memcmp(a->nsec3.salt, b->nsec3.salt, a->nsec3.salt_size) == 0 &&
|
FIELD_EQUAL(a->nsec3, b->nsec3, next_hashed_name) &&
|
||||||
memcmp(a->nsec3.next_hashed_name, b->nsec3.next_hashed_name, a->nsec3.next_hashed_name_size) == 0 &&
|
bitmap_equal(a->nsec3.types, b->nsec3.types);
|
||||||
bitmap_equal(a->nsec3.types, b->nsec3.types);
|
|
||||||
|
|
||||||
case DNS_TYPE_TLSA:
|
case DNS_TYPE_TLSA:
|
||||||
return a->tlsa.cert_usage == b->tlsa.cert_usage &&
|
return a->tlsa.cert_usage == b->tlsa.cert_usage &&
|
||||||
a->tlsa.selector == b->tlsa.selector &&
|
a->tlsa.selector == b->tlsa.selector &&
|
||||||
a->tlsa.matching_type == b->tlsa.matching_type &&
|
a->tlsa.matching_type == b->tlsa.matching_type &&
|
||||||
a->tlsa.data_size == b->tlsa.data_size &&
|
FIELD_EQUAL(a->tlsa, b->tlsa, data);
|
||||||
memcmp(a->tlsa.data, b->tlsa.data, a->tlsa.data_size) == 0;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return a->generic.size == b->generic.size &&
|
return FIELD_EQUAL(a->generic, b->generic, data);
|
||||||
memcmp(a->generic.data, b->generic.data, a->generic.size) == 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1157,7 +1152,7 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
r = base64_append(&s, n,
|
r = base64_append(&s, n,
|
||||||
rr->generic.data, rr->generic.size,
|
rr->generic.data, rr->generic.data_size,
|
||||||
8, columns());
|
8, columns());
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1165,12 +1160,12 @@ const char *dns_resource_record_to_string(DnsResourceRecord *rr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
t = hexmem(rr->generic.data, rr->generic.size);
|
t = hexmem(rr->generic.data, rr->generic.data_size);
|
||||||
if (!t)
|
if (!t)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Format as documented in RFC 3597, Section 5 */
|
/* Format as documented in RFC 3597, Section 5 */
|
||||||
r = asprintf(&s, "%s \\# %zu %s", k, rr->generic.size, t);
|
r = asprintf(&s, "%s \\# %zu %s", k, rr->generic.data_size, t);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
break;
|
break;
|
||||||
@ -1439,7 +1434,7 @@ static void dns_resource_record_hash_func(const void *i, struct siphash *state)
|
|||||||
|
|
||||||
case DNS_TYPE_OPENPGPKEY:
|
case DNS_TYPE_OPENPGPKEY:
|
||||||
default:
|
default:
|
||||||
siphash24_compress(rr->generic.data, rr->generic.size, state);
|
siphash24_compress(rr->generic.data, rr->generic.data_size, state);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -129,7 +129,7 @@ struct DnsResourceRecord {
|
|||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
void *data;
|
void *data;
|
||||||
size_t size;
|
size_t data_size;
|
||||||
} generic, opt;
|
} generic, opt;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user