[System]: Add missing System.Net.SecurityProtocolType enum values.
[mono.git] / mcs / class / System / System.Net / IPv6Address.cs
index 26bb3497c123cee8781c0c4c2e3028d56e218d7d..d2103b24f79699e5e547a23fe75181cec7a8eb7a 100644 (file)
@@ -89,6 +89,7 @@ namespace System.Net {
                static int Fill (ushort [] addr, string ipString)\r
                {\r
                        int p = 0;\r
+                       int pdigits = 0;\r
                        int slot = 0;\r
 \r
                        if (ipString.Length == 0)\r
@@ -103,6 +104,10 @@ namespace System.Net {
                                int n;\r
 \r
                                if (c == ':'){\r
+                                       // Leading : is not allowed.\r
+                                       if (i == 0)\r
+                                               return -1;\r
+                                      \r
                                        // Trailing : is not allowed.\r
                                        if (i == ipString.Length-1)\r
                                                return -1;\r
@@ -112,8 +117,13 @@ namespace System.Net {
                                        \r
                                        addr [slot++] = (ushort) p;\r
                                        p = 0;\r
+                                       pdigits = 0;\r
                                        continue;\r
-                               } if ('0' <= c && c <= '9')\r
+                               }\r
+                               pdigits++;\r
+                               if (pdigits > 4)\r
+                                       return -1;\r
+                               if ('0' <= c && c <= '9')\r
                                        n = (int) (c - '0');\r
                                else if ('a' <= c && c <= 'f')\r
                                        n = (int) (c - 'a' + 10);\r
@@ -182,7 +192,6 @@ namespace System.Net {
                        //\r
                        // Is there an ipv4 address at the end?\r
                        //\r
-                       bool ipv4 = false;\r
                        int pos2 = ipString.LastIndexOf (':');\r
                        if (pos2 == -1)\r
                                return false;\r
@@ -203,7 +212,6 @@ namespace System.Net {
                                                ipString = ipString.Substring (0, pos2 + 1);\r
                                        else\r
                                                ipString = ipString.Substring (0, pos2);\r
-                                       ipv4 = true;\r
                                        slots = 2;\r
                                }\r
                        }       \r
@@ -240,24 +248,6 @@ namespace System.Net {
                                        return false;\r
                        }\r
 \r
-                       // Now check the results in the ipv6-address range only\r
-                       bool ipv6 = false;\r
-                       for (int i = 0; i < slots; i++){\r
-                               if (addr [i] != 0 || i == 5 && addr [i] != 0xffff)\r
-                                       ipv6 = true;\r
-                       }\r
-                       \r
-                       // check IPv4 validity\r
-                       if (ipv4 && !ipv6) {\r
-                               for (int i = 0; i < 5; i++) {\r
-                                       if (addr [i] != 0)\r
-                                               return false;\r
-                               }\r
-\r
-                               if (addr [5] != 0 && addr [5] != 0xffff)\r
-                                       return false;\r
-                       }\r
-\r
                        result = new IPv6Address (addr, prefixLen, scopeId);\r
                        return true;\r
                }\r
@@ -313,9 +303,10 @@ namespace System.Net {
                }\r
 \r
                // Convert the address into a format expected by the IPAddress (long) ctor\r
-               private int AsIPv4Int ()\r
+               // This needs to be unsigned to satisfy the '> 1' test in IsIPv4Compatible()\r
+               private uint AsIPv4Int ()\r
                {\r
-                       return (SwapUShort (address [7]) << 16) + SwapUShort (address [6]);\r
+                       return (uint)(SwapUShort (address [7]) << 16) + SwapUShort (address [6]);\r
                }                       \r
 \r
                public bool IsIPv4Compatible ()\r
@@ -323,6 +314,12 @@ namespace System.Net {
                        for (int i = 0; i < 6; i++) \r
                                if (address [i] != 0)\r
                                        return false;\r
+                       /* MS .net only seems to format the last 4\r
+                        * bytes as an IPv4 address if address[6] is\r
+                        * non-zero\r
+                        */\r
+                       if (address[6] == 0)\r
+                               return false;\r
                        return (AsIPv4Int () > 1);\r
                }\r
                \r
@@ -331,6 +328,13 @@ namespace System.Net {
                        for (int i = 0; i < 5; i++) \r
                                if (address [i] != 0)\r
                                        return false;\r
+                       /* MS .net only seems to format the last 4\r
+                        * bytes as an IPv4 address if address[6] is\r
+                        * non-zero\r
+                        */\r
+                       if (address[6] == 0)\r
+                               return false;\r
+                       \r
                        return address [5] == 0xffff;\r
                }\r
                \r