]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
resolve MODAPP-80
authorAnthony Minessale <anthony.minessale@gmail.com>
Tue, 18 Mar 2008 03:24:03 +0000 (03:24 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Tue, 18 Mar 2008 03:24:03 +0000 (03:24 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7909 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/applications/mod_enum/mod_enum.c

index 86ab09d5c9c7b4139fe48a668b0126eb4c3e8c4c..448c1ddd64c172db6c5a891910fee0374a4ffb3a 100644 (file)
@@ -279,46 +279,57 @@ static void parse_rr(const struct dns_parse *p, enum_query_t * q, struct dns_rr
        const unsigned char *dend = rr->dnsrr_dend;
        unsigned char *dn = rr->dnsrr_dn;
        const unsigned char *c;
-       char *ptr;
        char flags;
        int order;
        int preference;
-       char *nme;
        char *service = NULL;
        char *regex = NULL;
        char *replace = NULL;
        int argc = 0;
        char *argv[4] = { 0 };
-       int leap;
+       int n;
+       char string_arg[3][256] = {{0}};
 
        switch (rr->dnsrr_typ) {
-
-       case DNS_T_NAPTR:                       /* prio weight port targetDN */
+       case DNS_T_NAPTR:/* prio weight port targetDN */
                c = dptr;
-               c += 2 + 2 + 2;
-               if (dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0 || c != dend)
+               c += 4; /* order, pref */
+
+               for (n = 0; n < 3; ++n) {
+                       if (c >= dend) {
+                               goto xperr;
+                       } else { 
+                               c += *c + 1;
+                       }
+               }
+
+               if (dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0 || c != dend) {
                        goto xperr;
+               }
+
                c = dptr;
+               order = dns_get16(c+0);
+               preference = dns_get16(c+2);
+               flags = (char) dns_get16(c + 4);
+               c += 4;
 
-               leap = *dn;
-               nme = (char *) dn + 1;
+               for(n = 0; n < 3; n++) {
+                       uint32_t len = *c++, cpylen = len;
+                       if (len > sizeof(string_arg[n]) - 1) {
+                               cpylen = sizeof(string_arg[n]) - 1;
+                       }
+                       strncpy(string_arg[n], (char *)c, cpylen);
+                       *(string_arg[n] + len) = '\0';
+                       c += len;
+               }
 
-               order = dns_get16(c + 0);
-               preference = dns_get16(c + 2);
-               flags = (char) dns_get16(c + 4);
+               service = string_arg[1];
 
-               if ((ptr = nme + leap)) {
-                       service = nme;
-                       *ptr++ = '\0';
-                       argc = switch_separate_string(ptr, '!', argv, (sizeof(argv) / sizeof(argv[0])));
+               if ((argc = switch_separate_string(string_arg[2], '!', argv, (sizeof(argv) / sizeof(argv[0]))))) {
                        regex = argv[1];
                        replace = argv[2];
-               }
-
-               for (ptr = replace; ptr && *ptr; ptr++) {
-                       if (*ptr == '\\') {
-                               *ptr = '$';
-                       }
+               } else {
+                       goto xperr;
                }
 
                if (flags && service && regex && replace) {
@@ -350,7 +361,7 @@ static void parse_rr(const struct dns_parse *p, enum_query_t * q, struct dns_rr
                                                }
                                        }
                                }
-
+                               
                                add_result(q, order, preference, service, uri);
                        }
 
@@ -365,7 +376,7 @@ static void parse_rr(const struct dns_parse *p, enum_query_t * q, struct dns_rr
 
        return;
 
-  xperr:
+       xperr:
        //printf("<parse error>\n");
        return;
 }