X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Fdns.c;h=41ccc8f3503c689e93ae6e612d22100f3656b3b5;hb=a4572037763c65ec34ac921a6e15b936c6525b5d;hp=0206ec767271227fb37fb0ad85daa937b3e69d55;hpb=b7e1f69e270e38642305d9064e9ca8051419b52c;p=catta diff --git a/avahi-core/dns.c b/avahi-core/dns.c index 0206ec7..41ccc8f 100644 --- a/avahi-core/dns.c +++ b/avahi-core/dns.c @@ -153,6 +153,19 @@ void avahi_dns_packet_inc_field(AvahiDnsPacket *p, unsigned idx) { avahi_dns_packet_set_field(p, idx, avahi_dns_packet_get_field(p, idx) + 1); } + +static void name_table_cleanup(void *key, void *value, void *user_data) { + AvahiDnsPacket *p = user_data; + + if ((uint8_t*) value >= AVAHI_DNS_PACKET_DATA(p) + p->size) + avahi_hashmap_remove(p->name_table, key); +} + +void avahi_dns_packet_cleanup_name_table(AvahiDnsPacket *p) { + if (p->name_table) + avahi_hashmap_foreach(p->name_table, name_table_cleanup, p); +} + uint8_t* avahi_dns_packet_append_name(AvahiDnsPacket *p, const char *name) { uint8_t *d, *saved_ptr = NULL; size_t saved_size; @@ -216,6 +229,8 @@ uint8_t* avahi_dns_packet_append_name(AvahiDnsPacket *p, const char *name) { fail: p->size = saved_size; + avahi_dns_packet_cleanup_name_table(p); + return NULL; } @@ -685,6 +700,8 @@ uint8_t* avahi_dns_packet_append_key(AvahiDnsPacket *p, AvahiKey *k, int unicast !avahi_dns_packet_append_uint16(p, k->type) || !avahi_dns_packet_append_uint16(p, k->clazz | (unicast_response ? AVAHI_DNS_UNICAST_RESPONSE : 0))) { p->size = size; + avahi_dns_packet_cleanup_name_table(p); + return NULL; } @@ -799,6 +816,8 @@ uint8_t* avahi_dns_packet_append_record(AvahiDnsPacket *p, AvahiRecord *r, int c fail: p->size = size; + avahi_dns_packet_cleanup_name_table(p); + return NULL; }