Module: sems Branch: rco/forking DELETED Commit: 495ae3216db3f26d69d002637a710a4ba90d1518 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=495ae3216db3f26d69d002637a710a4ba90d1518
Author: Raphael Coeffic <[email protected]> Committer: Raphael Coeffic <[email protected]> Date: Tue Oct 12 17:35:05 2010 +0200 check if destination is an IP address before calling resolve_name prior to this fix, SEMS would try to resolve things like _sip._udp.127.0.0.1 --- core/sip/resolver.cpp | 25 ++++++++++++++--------- core/sip/resolver.h | 11 ++++++--- core/sip/trans_layer.cpp | 47 ++++++++++++++++++++++++++------------------- 3 files changed, 49 insertions(+), 34 deletions(-) diff --git a/core/sip/resolver.cpp b/core/sip/resolver.cpp index e3443c7..1db4f06 100644 --- a/core/sip/resolver.cpp +++ b/core/sip/resolver.cpp @@ -222,6 +222,12 @@ public: //TODO: find a solution for IPv6 h->port = htons(e->port); ((sockaddr_in*)sa)->sin_port = h->port; + + // check if name is an IP address + if(resolver::instance()->str2ip(e->target.c_str(),h,sa,IPv4) == 1) { + return 0; + } + return resolver::instance()->resolve_name(e->target.c_str(),h,sa,IPv4); } }; @@ -460,6 +466,12 @@ bool dns_handle::eoip() return (ip_n == -1); } +void dns_handle::set_eoip() +{ + srv_n = -1; + ip_n = -1; +} + int dns_handle::next_ip(sockaddr_storage* sa) { if(!valid() || eoip()) return -1; @@ -532,22 +544,12 @@ int _resolver::resolve_name(const char* name, sockaddr_storage* sa, const address_type types) { - int ret; - // already have a valid handle? if(h->valid()){ if(h->eoip()) return -1; return h->next_ip(sa); } - // first try to detect if 'name' is already an IP address - ret = str2ip(name,sa,types); - if(ret == 1) { - h->ip_n = -1; // flag end of IP list - h->srv_n = -1; - return 0; // 'name' is an IP address - } - // name is NOT an IP address -> try a cache look up dns_bucket* b = cache.get_bucket(hashlittle(name,strlen(name),0)); dns_entry* e = b->find(name); @@ -583,6 +585,7 @@ int _resolver::resolve_name(const char* name, } int _resolver::str2ip(const char* name, + dns_handle* h, sockaddr_storage* sa, const address_type types) { @@ -590,6 +593,7 @@ int _resolver::str2ip(const char* name, int ret = inet_pton(AF_INET,name,&((sockaddr_in*)sa)->sin_addr); if(ret==1) { ((sockaddr_in*)sa)->sin_family = AF_INET; + h->set_eoip(); return 1; } else if(ret < 0) { @@ -602,6 +606,7 @@ int _resolver::str2ip(const char* name, int ret = inet_pton(AF_INET6,name,&((sockaddr_in6*)sa)->sin6_addr); if(ret==1) { ((sockaddr_in6*)sa)->sin6_family = AF_INET6; + h->set_eoip(); return 1; } else if(ret < 0) { diff --git a/core/sip/resolver.h b/core/sip/resolver.h index c663a8f..8c96fba 100644 --- a/core/sip/resolver.h +++ b/core/sip/resolver.h @@ -128,6 +128,8 @@ private: dns_ip_entry* ip_e; int ip_n; + + void set_eoip(); }; class _resolver @@ -139,6 +141,11 @@ public: sockaddr_storage* sa, const address_type types); + int str2ip(const char* name, + dns_handle* h, + sockaddr_storage* sa, + const address_type types); + protected: _resolver(); ~_resolver(); @@ -147,10 +154,6 @@ protected: dns_entry** e, long now); - int str2ip(const char* name, - sockaddr_storage* sa, - const address_type types); - void run(); void on_stop() {} diff --git a/core/sip/trans_layer.cpp b/core/sip/trans_layer.cpp index fbb2602..d7aab2e 100644 --- a/core/sip/trans_layer.cpp +++ b/core/sip/trans_layer.cpp @@ -692,28 +692,35 @@ int _trans_layer::set_next_hop(sip_msg* msg, int _trans_layer::set_destination_ip(sip_msg* msg, cstring* next_hop, unsigned short next_port) { string nh = c2stlstr(*next_hop); - - if(!next_port){ - // no explicit port specified, - // try SRV first - - string srv_name = "_sip._udp." + nh; - if(!resolver::instance()->resolve_name(srv_name.c_str(), - &(msg->h_dns), - &(msg->remote_ip),IPv4)){ - return 0; - } + resolver* res_inst = resolver::instance(); - DBG("no SRV record for %s",srv_name.c_str()); - } + // first try to detect if 'name' is already an IP address... + if(res_inst->str2ip(nh.c_str(),&(msg->h_dns),&(msg->remote_ip),IPv4) != 1) { - memset(&(msg->remote_ip),0,sizeof(sockaddr_storage)); - int err = resolver::instance()->resolve_name(nh.c_str(), - &(msg->h_dns), - &(msg->remote_ip),IPv4); - if(err < 0){ - ERROR("Unresolvable Request URI domain\n"); - return -1; + // ... if not, try to resolve the name + + if(!next_port){ + // no explicit port specified, + // try SRV first + + string srv_name = "_sip._udp." + nh; + if(!res_inst->resolve_name(srv_name.c_str(), + &(msg->h_dns), + &(msg->remote_ip),IPv4)){ + return 0; + } + + DBG("no SRV record for %s",srv_name.c_str()); + } + + memset(&(msg->remote_ip),0,sizeof(sockaddr_storage)); + int err = res_inst->resolve_name(nh.c_str(), + &(msg->h_dns), + &(msg->remote_ip),IPv4); + if(err < 0){ + ERROR("Unresolvable Request URI domain\n"); + return -1; + } } if(!((sockaddr_in*)&(msg->remote_ip))->sin_port) { _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
