Author: astitcher
Date: Thu May 26 20:38:52 2011
New Revision: 1128068

URL: http://svn.apache.org/viewvc?rev=1128068&view=rev
Log:
QPID-3282: Potential bug in circular connection detection:
- make sure that we compare numeric addresses of both local and remote ends
  of the connection (previously the remote end could be an unresolved hostname)

Modified:
    qpid/trunk/qpid/cpp/src/qpid/sys/SocketAddress.h
    qpid/trunk/qpid/cpp/src/qpid/sys/posix/Socket.cpp
    qpid/trunk/qpid/cpp/src/qpid/sys/posix/SocketAddress.cpp
    qpid/trunk/qpid/cpp/src/qpid/sys/windows/SocketAddress.cpp

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/SocketAddress.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/SocketAddress.h?rev=1128068&r1=1128067&r2=1128068&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/SocketAddress.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/SocketAddress.h Thu May 26 20:38:52 2011
@@ -41,7 +41,7 @@ public:
     QPID_COMMON_EXTERN SocketAddress& operator=(const SocketAddress&);
     QPID_COMMON_EXTERN ~SocketAddress();
 
-    std::string asString() const;
+    std::string asString(bool numeric=true) const;
 
 private:
     std::string host;

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/posix/Socket.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/posix/Socket.cpp?rev=1128068&r1=1128067&r2=1128068&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/posix/Socket.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/posix/Socket.cpp Thu May 26 20:38:52 2011
@@ -122,7 +122,14 @@ void Socket::connect(const std::string& 
 
 void Socket::connect(const SocketAddress& addr) const
 {
-    peername = addr.asString();
+    // The display name for an outbound connection needs to be the name that 
was specified
+    // for the address rather than a resolved IP address as we don't know 
which of
+    // the IP addresses is actually the one that will be connected to.
+    peername = addr.asString(false);
+
+    // However the string we compare with the local port must be numeric or it 
might not
+    // match when it should as getLocalAddress() will always be numeric
+    std::string connectname = addr.asString();
 
     createSocket(addr);
 
@@ -145,7 +152,7 @@ void Socket::connect(const SocketAddress
     // Raise an error if we see such a connection, since we know there is
     // no listener on the peer address.
     //
-    if (getLocalAddress() == getPeerAddress()) {
+    if (getLocalAddress() == connectname) {
         close();
         throw Exception(QPID_MSG("Connection refused: " << peername));
     }

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/posix/SocketAddress.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/posix/SocketAddress.cpp?rev=1128068&r1=1128067&r2=1128068&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/posix/SocketAddress.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/posix/SocketAddress.cpp Thu May 26 
20:38:52 2011
@@ -61,9 +61,23 @@ SocketAddress::~SocketAddress()
     }
 }
 
-std::string SocketAddress::asString() const
+std::string SocketAddress::asString(bool numeric) const
 {
-    return host + ":" + port;
+    if (!numeric)
+        return host + ":" + port;
+    // Canonicalise into numeric id
+    const ::addrinfo& ai = getAddrInfo(*this);
+    char servName[NI_MAXSERV];
+    char dispName[NI_MAXHOST];
+    if (int rc=::getnameinfo(ai.ai_addr, ai.ai_addrlen,
+                            dispName, sizeof(dispName),
+                            servName, sizeof(servName),
+                            NI_NUMERICHOST | NI_NUMERICSERV) != 0)
+        throw QPID_POSIX_ERROR(rc);
+    std::string s(dispName);
+    s += ":";
+    s += servName;
+    return s;
 }
 
 const ::addrinfo& getAddrInfo(const SocketAddress& sa)
@@ -84,7 +98,7 @@ const ::addrinfo& getAddrInfo(const Sock
 
         int n = ::getaddrinfo(node, service, &hints, &sa.addrInfo);
         if (n != 0)
-            throw Exception(QPID_MSG("Cannot resolve " << sa.asString() << ": 
" << ::gai_strerror(n)));
+            throw Exception(QPID_MSG("Cannot resolve " << sa.asString(false) 
<< ": " << ::gai_strerror(n)));
     }
 
     return *sa.addrInfo;

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/windows/SocketAddress.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/windows/SocketAddress.cpp?rev=1128068&r1=1128067&r2=1128068&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/windows/SocketAddress.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/windows/SocketAddress.cpp Thu May 26 
20:38:52 2011
@@ -63,7 +63,7 @@ SocketAddress::~SocketAddress()
     ::freeaddrinfo(addrInfo);
 }
 
-std::string SocketAddress::asString() const
+std::string SocketAddress::asString(bool) const
 {
     return host + ":" + port;
 }



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscr...@qpid.apache.org

Reply via email to