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.
This commit is contained in:
Lennart Poettering
2015-08-21 16:04:59 +02:00
parent ef7051360a
commit f6a5fec6b9
4 changed files with 23 additions and 4 deletions
+2
View 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();
+2
View 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;
+18 -4
View 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;
+1
View File
@@ -86,6 +86,7 @@ struct DnsPacket {
uint32_t ttl;
bool extracted;
bool refuse_compression;
};
static inline uint8_t* DNS_PACKET_DATA(DnsPacket *p) {