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

Reply via email to