From f6a5fec6b971e2a8c69d92ab20ed13693be82ddb Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 21 Aug 2015 16:04:59 +0200 Subject: [PATCH 1/2] resolved: when passing RRs across the bus, make sure not to use name compression We explicitly need to turn off name compression when marshalling or demarshalling RRs for bus transfer, since they otherwise refer to packet offsets that reference packets that are not transmitted themselves. --- src/resolve-host/resolve-host.c | 2 ++ src/resolve/resolved-bus.c | 2 ++ src/resolve/resolved-dns-packet.c | 22 ++++++++++++++++++---- src/resolve/resolved-dns-packet.h | 1 + 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/resolve-host/resolve-host.c b/src/resolve-host/resolve-host.c index 3f45a9f0e8c..feec1928137 100644 --- a/src/resolve-host/resolve-host.c +++ b/src/resolve-host/resolve-host.c @@ -392,6 +392,8 @@ static int resolve_record(sd_bus *bus, const char *name) { if (r < 0) return log_oom(); + p->refuse_compression = true; + r = dns_packet_append_blob(p, d, l, NULL); if (r < 0) return log_oom(); diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c index de5e8e9c295..1f23834ce3c 100644 --- a/src/resolve/resolved-bus.c +++ b/src/resolve/resolved-bus.c @@ -542,6 +542,8 @@ static void bus_method_resolve_record_complete(DnsQuery *q) { if (r < 0) goto finish; + p->refuse_compression = true; + r = dns_packet_append_rr(p, answer->items[i].rr, &start); if (r < 0) goto finish; diff --git a/src/resolve/resolved-dns-packet.c b/src/resolve/resolved-dns-packet.c index ad337c2714a..bebd1ee4a6e 100644 --- a/src/resolve/resolved-dns-packet.c +++ b/src/resolve/resolved-dns-packet.c @@ -388,14 +388,21 @@ int dns_packet_append_label(DnsPacket *p, const char *d, size_t l, size_t *start return 0; } -int dns_packet_append_name(DnsPacket *p, const char *name, - bool allow_compression, size_t *start) { +int dns_packet_append_name( + DnsPacket *p, + const char *name, + bool allow_compression, + size_t *start) { + size_t saved_size; int r; assert(p); assert(name); + if (p->refuse_compression) + allow_compression = false; + saved_size = p->size; while (*name) { @@ -1053,8 +1060,12 @@ fail: return r; } -int dns_packet_read_name(DnsPacket *p, char **_ret, - bool allow_compression, size_t *start) { +int dns_packet_read_name( + DnsPacket *p, + char **_ret, + bool allow_compression, + size_t *start) { + size_t saved_rindex, after_rindex = 0, jump_barrier; _cleanup_free_ char *ret = NULL; size_t n = 0, allocated = 0; @@ -1064,6 +1075,9 @@ int dns_packet_read_name(DnsPacket *p, char **_ret, assert(p); assert(_ret); + if (p->refuse_compression) + allow_compression = false; + saved_rindex = p->rindex; jump_barrier = p->rindex; diff --git a/src/resolve/resolved-dns-packet.h b/src/resolve/resolved-dns-packet.h index 58559c85df4..e81f8a82020 100644 --- a/src/resolve/resolved-dns-packet.h +++ b/src/resolve/resolved-dns-packet.h @@ -86,6 +86,7 @@ struct DnsPacket { uint32_t ttl; bool extracted; + bool refuse_compression; }; static inline uint8_t* DNS_PACKET_DATA(DnsPacket *p) { From 09b1fe142b6f4bdbf925e04a916b97e5eb445bcb Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 21 Aug 2015 16:06:25 +0200 Subject: [PATCH 2/2] resolve-host: Minor wording improvement --- src/resolve-host/resolve-host.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/resolve-host/resolve-host.c b/src/resolve-host/resolve-host.c index feec1928137..4a7d1e31733 100644 --- a/src/resolve-host/resolve-host.c +++ b/src/resolve-host/resolve-host.c @@ -443,7 +443,7 @@ static void help_dns_types(void) { const char *t; if (arg_legend) - puts("Known dns types:"); + puts("Known DNS RR types:"); for (i = 0; i < _DNS_TYPE_MAX; i++) { t = dns_type_to_string(i); if (t) @@ -456,7 +456,7 @@ static void help_dns_classes(void) { const char *t; if (arg_legend) - puts("Known dns classes:"); + puts("Known DNS RR classes:"); for (i = 0; i < _DNS_CLASS_MAX; i++) { t = dns_class_to_string(i); if (t)