BUG#: 8619
authorvenkat.puvvada <venkat.puvvada>
Wed, 16 Sep 2009 04:01:59 +0000 (04:01 +0000)
committervenkat.puvvada <venkat.puvvada>
Wed, 16 Sep 2009 04:01:59 +0000 (04:01 +0000)
TITLE: System::isLoopBack() doest not handle all allowed IPv4 loopback addresses
DESCRIPTION: System::isLoopBack() is modified to check all allowed IPv4 loopback addresses

src/Pegasus/Common/HostAddress.h
src/Pegasus/Common/System.cpp
src/Pegasus/Common/tests/System/System.cpp
src/slp/slp_client/src/cmd-utils/slp_client/slp_utils.cpp
src/slp/slp_client/src/cmd-utils/slp_client/slp_utils.h

index 97227ddb917a92ae8b7bc80decbc9fcb39a1cfa6..9763a0f60f7aaabfe203db5478aacbb1cf085943 100644 (file)
@@ -68,6 +68,10 @@ PEGASUS_NAMESPACE_BEGIN
 #define PEGASUS_IPV4_LOOPBACK_INIT 0x7F000001
 #endif
 
+#define PEGASUS_IPV4_LOOPBACK_RANGE_START 0x7F000000
+#define PEGASUS_IPV4_LOOPBACK_RANGE_END 0x7FFFFFFF
+
+
 #ifdef PEGASUS_ENABLE_IPV6
 #define PEGASUS_IN6_ADDR_SIZE (sizeof (struct in6_addr))
 #else
index 4484900608b63682b333c84efe21d7b012c263ac..ea21d551979afec9d76fdd8e9819cf383d9941b3 100644 (file)
@@ -588,7 +588,6 @@ Boolean System::isLoopBack(int af, void *binIPAddress)
 #ifdef PEGASUS_ENABLE_IPV6
     struct in6_addr ip6 = PEGASUS_IPV6_LOOPBACK_INIT;
 #endif
-    Uint32 ip4 = PEGASUS_IPV4_LOOPBACK_INIT;
     switch (af)
     {
 #ifdef PEGASUS_ENABLE_IPV6
@@ -600,7 +599,8 @@ Boolean System::isLoopBack(int af, void *binIPAddress)
             Uint32 tmp;
             memcpy(&tmp, binIPAddress, sizeof(Uint32));
             Uint32 n = ntohl(tmp);
-            return !memcmp(&ip4, &n, sizeof (ip4));
+            return n >= PEGASUS_IPV4_LOOPBACK_RANGE_START && 
+                n <= PEGASUS_IPV4_LOOPBACK_RANGE_END;
         }
     }
 
index 87cbd1e3ffab9e3ae5941ff79e7b81e5555e300d..794f34b2771dbcb1b7cafe8bc1a3d4824ee513b3 100644 (file)
@@ -73,6 +73,21 @@ static void _testIPv6()
         "127.0.0.1", binAddr) == 1);
     PEGASUS_TEST_ASSERT(System::isLoopBack(HostAddress::AT_IPV4, binAddr));
 
+    PEGASUS_TEST_ASSERT(HostAddress::convertTextToBinary(HostAddress::AT_IPV4,
+        "127.0.0.8", binAddr) == 1);
+    PEGASUS_TEST_ASSERT(System::isLoopBack(HostAddress::AT_IPV4, binAddr));
+
+    PEGASUS_TEST_ASSERT(HostAddress::convertTextToBinary(HostAddress::AT_IPV4,
+        "127.10.120.18", binAddr) == 1);
+    PEGASUS_TEST_ASSERT(System::isLoopBack(HostAddress::AT_IPV4, binAddr));
+
+    PEGASUS_TEST_ASSERT(HostAddress::convertTextToBinary(HostAddress::AT_IPV4,
+        "127.255.255.255", binAddr) == 1);
+    PEGASUS_TEST_ASSERT(System::isLoopBack(HostAddress::AT_IPV4, binAddr));
+
+    PEGASUS_TEST_ASSERT(HostAddress::convertTextToBinary(HostAddress::AT_IPV4,
+        "127.0.0.0", binAddr) == 1);
+    PEGASUS_TEST_ASSERT(System::isLoopBack(HostAddress::AT_IPV4, binAddr));
 
     PEGASUS_TEST_ASSERT(HostAddress::convertTextToBinary(HostAddress::AT_IPV6,
         "::1", binAddr) == 1);
index 30d005b098969d2181c69072731f566992ed238e..869bfb78e067b7d7e26c52ba5b876cab005e5914 100644 (file)
@@ -339,7 +339,6 @@ BOOL slp_is_loop_back(int af, void *addr)
 #ifdef PEGASUS_ENABLE_IPV6
     struct in6_addr ip6 = PEGASUS_IPV6_LOOPBACK_INIT;
 #endif
-    uint32 ip4 = PEGASUS_IPV4_LOOPBACK_INIT;
     if (!addr)
     {
         return FALSE;
@@ -353,7 +352,8 @@ BOOL slp_is_loop_back(int af, void *addr)
         case AF_INET:
             {
                 uint32 n = ntohl( *(uint32*)addr);
-                return !memcmp(&ip4, &n, sizeof (ip4));
+                return n >= PEGASUS_IPV4_LOOPBACK_RANGE_START && 
+                    n <= PEGASUS_IPV4_LOOPBACK_RANGE_END;
             }
     }
 
index 3448e08604baf7710537289ac51b7e942bf822a3..84d87d68c29ec07593282864a839cda3d5a55d7d 100644 (file)
@@ -98,6 +98,9 @@
 #define PEGASUS_IPV4_LOOPBACK_INIT 0x7F000001
 #endif
 
+#define PEGASUS_IPV4_LOOPBACK_RANGE_START 0x7F000000
+#define PEGASUS_IPV4_LOOPBACK_RANGE_END 0x7FFFFFFF
+
 #ifdef PEGASUS_ENABLE_IPV6
 #define PEGASUS_IN6_ADDR_SIZE (sizeof (struct in6_addr))
 #else