]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: when passing RRs across the bus, make sure not to use name compression
authorLennart Poettering <lennart@poettering.net>
Fri, 21 Aug 2015 14:04:59 +0000 (16:04 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 21 Aug 2015 14:04:59 +0000 (16:04 +0200)
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
src/resolve/resolved-bus.c
src/resolve/resolved-dns-packet.c
src/resolve/resolved-dns-packet.h

index 3f45a9f0e8c98fad7fff3098ba87ddb90e6e6bf1..feec19281373abc1a26b210c059418f70c96277a 100644 (file)
@@ -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();
index de5e8e9c2959b642d6bfbafd31fea0e149020ee0..1f23834ce3ce0b42e70d55b049fd56af37fdda49 100644 (file)
@@ -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;
index ad337c2714a37854d3958e15c3e4e1765b89b563..bebd1ee4a6e55f64d32ddd80c496d2b520769bdb 100644 (file)
@@ -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;
 
index 58559c85df4be6ab440b70a314706b9770430ef1..e81f8a820202f7ef470cd44cfc58ac5f3c3534f8 100644 (file)
@@ -86,6 +86,7 @@ struct DnsPacket {
         uint32_t ttl;
 
         bool extracted;
+        bool refuse_compression;
 };
 
 static inline uint8_t* DNS_PACKET_DATA(DnsPacket *p) {