resolve MODAPP-80
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7909 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
6667eed75e
commit
6b8be36518
|
@ -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;
|
const unsigned char *dend = rr->dnsrr_dend;
|
||||||
unsigned char *dn = rr->dnsrr_dn;
|
unsigned char *dn = rr->dnsrr_dn;
|
||||||
const unsigned char *c;
|
const unsigned char *c;
|
||||||
char *ptr;
|
|
||||||
char flags;
|
char flags;
|
||||||
int order;
|
int order;
|
||||||
int preference;
|
int preference;
|
||||||
char *nme;
|
|
||||||
char *service = NULL;
|
char *service = NULL;
|
||||||
char *regex = NULL;
|
char *regex = NULL;
|
||||||
char *replace = NULL;
|
char *replace = NULL;
|
||||||
int argc = 0;
|
int argc = 0;
|
||||||
char *argv[4] = { 0 };
|
char *argv[4] = { 0 };
|
||||||
int leap;
|
int n;
|
||||||
|
char string_arg[3][256] = {{0}};
|
||||||
|
|
||||||
switch (rr->dnsrr_typ) {
|
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)
|
|
||||||
goto xperr;
|
|
||||||
c = dptr;
|
c = dptr;
|
||||||
|
c += 4; /* order, pref */
|
||||||
|
|
||||||
leap = *dn;
|
for (n = 0; n < 3; ++n) {
|
||||||
nme = (char *) dn + 1;
|
if (c >= dend) {
|
||||||
|
goto xperr;
|
||||||
order = dns_get16(c + 0);
|
} else {
|
||||||
preference = dns_get16(c + 2);
|
c += *c + 1;
|
||||||
flags = (char) dns_get16(c + 4);
|
}
|
||||||
|
|
||||||
if ((ptr = nme + leap)) {
|
|
||||||
service = nme;
|
|
||||||
*ptr++ = '\0';
|
|
||||||
argc = switch_separate_string(ptr, '!', argv, (sizeof(argv) / sizeof(argv[0])));
|
|
||||||
regex = argv[1];
|
|
||||||
replace = argv[2];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ptr = replace; ptr && *ptr; ptr++) {
|
if (dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0 || c != dend) {
|
||||||
if (*ptr == '\\') {
|
goto xperr;
|
||||||
*ptr = '$';
|
}
|
||||||
|
|
||||||
|
c = dptr;
|
||||||
|
order = dns_get16(c+0);
|
||||||
|
preference = dns_get16(c+2);
|
||||||
|
flags = (char) dns_get16(c + 4);
|
||||||
|
c += 4;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
service = string_arg[1];
|
||||||
|
|
||||||
|
if ((argc = switch_separate_string(string_arg[2], '!', argv, (sizeof(argv) / sizeof(argv[0]))))) {
|
||||||
|
regex = argv[1];
|
||||||
|
replace = argv[2];
|
||||||
|
} else {
|
||||||
|
goto xperr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags && service && regex && replace) {
|
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);
|
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;
|
return;
|
||||||
|
|
||||||
xperr:
|
xperr:
|
||||||
//printf("<parse error>\n");
|
//printf("<parse error>\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue