Author: file Date: Mon Mar 23 10:51:30 2015 New Revision: 433305 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=433305 Log: Use the approach srv.c uses for enforcing limits and interpreting the SRV record.
Modified: team/group/dns_srv/main/dns_srv.c Modified: team/group/dns_srv/main/dns_srv.c URL: http://svnview.digium.com/svn/asterisk/team/group/dns_srv/main/dns_srv.c?view=diff&rev=433305&r1=433304&r2=433305 ============================================================================== --- team/group/dns_srv/main/dns_srv.c (original) +++ team/group/dns_srv/main/dns_srv.c Mon Mar 23 10:51:30 2015 @@ -43,17 +43,22 @@ struct ast_dns_record *ast_dns_srv_alloc(struct ast_dns_query *query, const char *data, const size_t size) { + struct srv { + uint16_t priority; + uint16_t weight; + uint16_t port; + } __attribute__((__packed__)) *srv_record; const char *ptr; char *srv_offset; char *srv_search_base = (char *)query->result->answer; size_t remaining_size = query->result->answer_size; - size_t remaining = size; struct ast_dns_srv_record *srv; - uint16_t priority; - uint16_t weight; - uint16_t port; int host_size; char host[NI_MAXHOST] = ""; + + if (size < sizeof(*srv_record)) { + return NULL; + } while (1) { srv_offset = memchr(srv_search_base, data[0], remaining_size); @@ -72,25 +77,8 @@ ast_assert(ptr != NULL); - if (remaining < 2) { - return NULL; - } - priority = (ptr[1] << 0) | (ptr[0] << 8); - ptr += 2; - remaining -= 2; - - if (remaining < 2) { - return NULL; - } - weight = (ptr[1] << 0) | (ptr[0] << 8); - ptr += 2; - remaining -= 2; - - if (remaining < 2) { - return NULL; - } - port = (ptr[1] << 0) | (ptr[0] << 8); - ptr += 2; + srv_record = (struct srv *)ptr; + ptr += sizeof(*srv_record); host_size = dn_expand((unsigned char *)query->result->answer, (unsigned char *) (srv_offset + size), (unsigned char *) ptr, host, sizeof(host) - 1); if (host_size < 0) { @@ -107,9 +95,9 @@ return NULL; } - srv->priority = priority; - srv->weight = weight; - srv->port = port; + srv->priority = ntohs(srv_record->priority); + srv->weight = ntohs(srv_record->weight); + srv->port = ntohs(srv_record->port); srv->host = srv->data + size; strcpy((char *)srv->host, host); /* SAFE */ -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits