X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Fdns.c;h=a9ccda5e246676ef978a720fd0a01a0c0bf7685e;hb=d322a943be5387a539f8f3ea3a19a7e2ed5a55a2;hp=9bc7aec4b615d3aa10832e4aead759437b7d45c0;hpb=4f0a5e7572a4257894b4bfede42c26d65152609e;p=catta diff --git a/avahi-core/dns.c b/avahi-core/dns.c index 9bc7aec..a9ccda5 100644 --- a/avahi-core/dns.c +++ b/avahi-core/dns.c @@ -165,7 +165,6 @@ uint8_t* avahi_dns_packet_append_name(AvahiDnsPacket *p, const char *name) { const char *pname; char label[64], *u; - /* Check whether we can compress this name. */ if (p->name_table && (prev = avahi_hashmap_lookup(p->name_table, name))) { @@ -177,11 +176,12 @@ uint8_t* avahi_dns_packet_append_name(AvahiDnsPacket *p, const char *name) { assert(idx < p->size); if (idx < 0x4000) { - uint16_t *t; - if (!(t = (uint16_t*) avahi_dns_packet_extend(p, sizeof(uint16_t)))) + uint8_t *t; + if (!(t = (uint8_t*) avahi_dns_packet_extend(p, sizeof(uint16_t)))) return NULL; - *t = htons((0xC000 | idx)); + t[0] = (uint8_t) ((0xC000 | idx) >> 8); + t[1] = (uint8_t) idx; return saved_ptr; } } @@ -223,7 +223,8 @@ uint8_t* avahi_dns_packet_append_uint16(AvahiDnsPacket *p, uint16_t v) { if (!(d = avahi_dns_packet_extend(p, sizeof(uint16_t)))) return NULL; - *((uint16_t*) d) = htons(v); + d[0] = (uint8_t) (v >> 8); + d[1] = (uint8_t) v; return d; } @@ -234,7 +235,10 @@ uint8_t *avahi_dns_packet_append_uint32(AvahiDnsPacket *p, uint32_t v) { if (!(d = avahi_dns_packet_extend(p, sizeof(uint32_t)))) return NULL; - *((uint32_t*) d) = htonl(v); + d[0] = (uint8_t) (v >> 24); + d[1] = (uint8_t) (v >> 16); + d[2] = (uint8_t) (v >> 8); + d[3] = (uint8_t) v; return d; } @@ -286,21 +290,37 @@ uint8_t *avahi_dns_packet_extend(AvahiDnsPacket *p, size_t l) { return d; } -int avahi_dns_packet_is_valid(AvahiDnsPacket *p) { +int avahi_dns_packet_check_valid(AvahiDnsPacket *p) { uint16_t flags; assert(p); - if (p->size < 12) + if (p->size < AVAHI_DNS_PACKET_HEADER_SIZE) return -1; flags = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_FLAGS); + + if (flags & AVAHI_DNS_FLAG_OPCODE) + return -1; + + return 0; +} - if (flags & AVAHI_DNS_FLAG_OPCODE || flags & AVAHI_DNS_FLAG_RCODE) +int avahi_dns_packet_check_valid_multicast(AvahiDnsPacket *p) { + uint16_t flags; + assert(p); + + if (avahi_dns_packet_check_valid(p) < 0) + return -1; + + flags = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_FLAGS); + + if (flags & AVAHI_DNS_FLAG_RCODE) return -1; return 0; } + int avahi_dns_packet_is_query(AvahiDnsPacket *p) { assert(p); @@ -350,7 +370,7 @@ static int consume_labels(AvahiDnsPacket *p, unsigned idx, char *ret_name, size_ } else first_label = 0; - if (!(avahi_escape_label(AVAHI_DNS_PACKET_DATA(p) + idx, n, &ret_name, &l))) + if (!(avahi_escape_label((char*) AVAHI_DNS_PACKET_DATA(p) + idx, n, &ret_name, &l))) return -1; idx += n; @@ -385,26 +405,32 @@ int avahi_dns_packet_consume_name(AvahiDnsPacket *p, char *ret_name, size_t l) { } int avahi_dns_packet_consume_uint16(AvahiDnsPacket *p, uint16_t *ret_v) { + uint8_t *d; + assert(p); assert(ret_v); if (p->rindex + sizeof(uint16_t) > p->size) return -1; - *ret_v = ntohs(*((uint16_t*) (AVAHI_DNS_PACKET_DATA(p) + p->rindex))); + d = (uint8_t*) (AVAHI_DNS_PACKET_DATA(p) + p->rindex); + *ret_v = (d[0] << 8) | d[1]; p->rindex += sizeof(uint16_t); return 0; } int avahi_dns_packet_consume_uint32(AvahiDnsPacket *p, uint32_t *ret_v) { + uint8_t* d; + assert(p); assert(ret_v); if (p->rindex + sizeof(uint32_t) > p->size) return -1; - *ret_v = ntohl(*((uint32_t*) (AVAHI_DNS_PACKET_DATA(p) + p->rindex))); + d = (uint8_t*) (AVAHI_DNS_PACKET_DATA(p) + p->rindex); + *ret_v = (d[0] << 24) | (d[1] << 16) | (d[2] << 8) | d[3]; p->rindex += sizeof(uint32_t); return 0; @@ -478,7 +504,6 @@ AvahiRecord* avahi_dns_packet_consume_record(AvahiDnsPacket *p, int *ret_cache_f const void* start; assert(p); - assert(ret_cache_flush); /* avahi_log_debug("consume_record()"); */ @@ -492,7 +517,8 @@ AvahiRecord* avahi_dns_packet_consume_record(AvahiDnsPacket *p, int *ret_cache_f /* avahi_log_debug("name = %s, rdlength = %u", name, rdlength); */ - *ret_cache_flush = !!(class & AVAHI_DNS_CACHE_FLUSH); + if (ret_cache_flush) + *ret_cache_flush = !!(class & AVAHI_DNS_CACHE_FLUSH); class &= ~AVAHI_DNS_CACHE_FLUSH; start = avahi_dns_packet_get_rptr(p); @@ -503,6 +529,7 @@ AvahiRecord* avahi_dns_packet_consume_record(AvahiDnsPacket *p, int *ret_cache_f switch (type) { case AVAHI_DNS_TYPE_PTR: case AVAHI_DNS_TYPE_CNAME: + case AVAHI_DNS_TYPE_NS: /* avahi_log_debug("ptr"); */ @@ -608,16 +635,17 @@ AvahiKey* avahi_dns_packet_consume_key(AvahiDnsPacket *p, int *ret_unicast_respo uint16_t type, class; assert(p); - assert(ret_unicast_response); if (avahi_dns_packet_consume_name(p, name, sizeof(name)) < 0 || avahi_dns_packet_consume_uint16(p, &type) < 0 || avahi_dns_packet_consume_uint16(p, &class) < 0) return NULL; - *ret_unicast_response = !!(class & AVAHI_DNS_UNICAST_RESPONSE); - class &= ~AVAHI_DNS_UNICAST_RESPONSE; + if (ret_unicast_response) + *ret_unicast_response = !!(class & AVAHI_DNS_UNICAST_RESPONSE); + class &= ~AVAHI_DNS_UNICAST_RESPONSE; + return avahi_key_new(name, class, type); } @@ -661,8 +689,9 @@ uint8_t* avahi_dns_packet_append_record(AvahiDnsPacket *p, AvahiRecord *r, int c switch (r->key->type) { case AVAHI_DNS_TYPE_PTR: - case AVAHI_DNS_TYPE_CNAME : - + case AVAHI_DNS_TYPE_CNAME: + case AVAHI_DNS_TYPE_NS: + if (!(avahi_dns_packet_append_name(p, r->data.ptr.name))) goto fail; @@ -733,7 +762,8 @@ uint8_t* avahi_dns_packet_append_record(AvahiDnsPacket *p, AvahiRecord *r, int c /* avahi_log_debug("appended %u", size); */ - * (uint16_t*) l = htons((uint16_t) size); + l[0] = (uint8_t) ((uint16_t) size >> 8); + l[1] = (uint8_t) ((uint16_t) size); return t;