X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fresolve%2Fresolved-dns-packet.c;h=f22582971e6fefb1062445cc6014eccf54683d05;hb=9de3e3294065e8697ff10130b53f274319cdcf6f;hp=5eaee2cb4f751e2be52a1475deb869366f3d6ad1;hpb=ea917db9e662ae6e6d0ae07e0118b323688c8616;p=elogind.git diff --git a/src/resolve/resolved-dns-packet.c b/src/resolve/resolved-dns-packet.c index 5eaee2cb4..f22582971 100644 --- a/src/resolve/resolved-dns-packet.c +++ b/src/resolve/resolved-dns-packet.c @@ -21,6 +21,7 @@ #include "utf8.h" #include "util.h" +#include "strv.h" #include "resolved-dns-domain.h" #include "resolved-dns-packet.h" @@ -512,6 +513,19 @@ int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, size_t *star r = dns_packet_append_string(p, rr->hinfo.os, NULL); break; + case DNS_TYPE_SPF: /* exactly the same as TXT */ + case DNS_TYPE_TXT: { + char **s; + + STRV_FOREACH(s, rr->txt.strings) { + r = dns_packet_append_string(p, *s, NULL); + if (r < 0) + goto fail; + } + + break; + } + case DNS_TYPE_A: r = dns_packet_append_blob(p, &rr->a.in_addr, sizeof(struct in_addr), NULL); break; @@ -549,7 +563,13 @@ int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, size_t *star break; case DNS_TYPE_MX: - case DNS_TYPE_TXT: + r = dns_packet_append_uint16(p, rr->mx.priority, NULL); + if (r < 0) + goto fail; + + r = dns_packet_append_name(p, rr->mx.exchange, NULL); + break; + case DNS_TYPE_SRV: case DNS_TYPE_DNAME: case DNS_TYPE_SSHFP: @@ -574,6 +594,9 @@ int dns_packet_append_rr(DnsPacket *p, const DnsResourceRecord *rr, size_t *star goto fail; p->size = end; + if (start) + *start = saved_size; + return 0; fail: @@ -868,6 +891,12 @@ int dns_packet_read_rr(DnsPacket *p, DnsResourceRecord **ret, size_t *start) { if (r < 0) goto fail; + if (key->class == DNS_CLASS_ANY || + key->type == DNS_TYPE_ANY) { + r = -EBADMSG; + goto fail; + } + rr = dns_resource_record_new(key); if (!rr) { r = -ENOMEM; @@ -905,6 +934,22 @@ int dns_packet_read_rr(DnsPacket *p, DnsResourceRecord **ret, size_t *start) { r = dns_packet_read_string(p, &rr->hinfo.os, NULL); break; + case DNS_TYPE_SPF: /* exactly the same as TXT */ + case DNS_TYPE_TXT: { + char *s; + + while (p->rindex < p->size) { + r = dns_packet_read_string(p, &s, NULL); + if (r < 0) + goto fail; + + r = strv_consume(&rr->txt.strings, s); + if (r < 0) + goto fail; + }; + break; + } + case DNS_TYPE_A: r = dns_packet_read_blob(p, &rr->a.in_addr, sizeof(struct in_addr), NULL); break; @@ -942,7 +987,13 @@ int dns_packet_read_rr(DnsPacket *p, DnsResourceRecord **ret, size_t *start) { break; case DNS_TYPE_MX: - case DNS_TYPE_TXT: + r = dns_packet_read_uint16(p, &rr->mx.priority, NULL); + if (r < 0) + goto fail; + + r = dns_packet_read_name(p, &rr->mx.exchange, NULL); + break; + case DNS_TYPE_SRV: case DNS_TYPE_DNAME: case DNS_TYPE_SSHFP: