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

Reply via email to