2006-02-16 Dick Porter <dick@ximian.com>
authorDick Porter <dick@acm.org>
Thu, 16 Feb 2006 18:07:53 +0000 (18:07 -0000)
committerDick Porter <dick@acm.org>
Thu, 16 Feb 2006 18:07:53 +0000 (18:07 -0000)
        * IPEndPoint.cs: The SocketAddress AddressFamily takes up the
        first two bytes, not just one.  Check the size of the
        SocketAddress buffer for IPv6 as well.

        * Dns.cs: Cope when GetHostByName_internal or
        GetHostByAddr_internal returns fewer items in the array than it
        intended to (maybe due to conversion errors.)

svn path=/trunk/mcs/; revision=56953

mcs/class/System/System.Net/ChangeLog
mcs/class/System/System.Net/Dns.cs
mcs/class/System/System.Net/IPEndPoint.cs

index f54ccfcc25cb98445cec319de30c71afde6f5e92..0de4bdd37ac03bceed58b0f95ac220fd1255a00c 100644 (file)
@@ -1,3 +1,13 @@
+2006-02-16  Dick Porter  <dick@ximian.com>
+
+       * IPEndPoint.cs: The SocketAddress AddressFamily takes up the
+       first two bytes, not just one.  Check the size of the
+       SocketAddress buffer for IPv6 as well.
+
+       * Dns.cs: Cope when GetHostByName_internal or
+       GetHostByAddr_internal returns fewer items in the array than it
+       intended to (maybe due to conversion errors.)
+
 2006-02-09  Carlos Alberto Cortez <calberto.cortez@gmail.com>
 
        * FtpWebResponse.cs: Add UpdateStatus method, to update both
index c4b1eac36130982e263a644aac7287885ea5364e..bef0a3115bb3e522b3ec426f03d722465c61dda7 100644 (file)
@@ -107,11 +107,19 @@ namespace System.Net {
                        he.HostName = h_name;
                        he.Aliases = h_aliases;
                        for(int i=0; i<h_addrlist.Length; i++) {
-                               IPAddress newAddress = IPAddress.Parse(h_addrlist[i]);
-
-                               if( (Socket.SupportsIPv6 && newAddress.AddressFamily == AddressFamily.InterNetworkV6) ||
-                                       (Socket.SupportsIPv4 && newAddress.AddressFamily == AddressFamily.InterNetwork) )
-                                       addrlist.Add(newAddress);
+                               try {
+                                       IPAddress newAddress = IPAddress.Parse(h_addrlist[i]);
+
+                                       if( (Socket.SupportsIPv6 && newAddress.AddressFamily == AddressFamily.InterNetworkV6) ||
+                                           (Socket.SupportsIPv4 && newAddress.AddressFamily == AddressFamily.InterNetwork) )
+                                               addrlist.Add(newAddress);
+                               } catch (ArgumentNullException) {
+                                       /* Ignore this, as the
+                                        * internal call might have
+                                        * left some blank entries at
+                                        * the end of the array
+                                        */
+                               }
                        }
 
                        if(addrlist.Count == 0)
index 2e81c62a2ea4e3bc268ab2cef842d67253dd7db7..22aae683ec68d6f580f6be78723077c8163bf40f 100644 (file)
@@ -96,23 +96,31 @@ namespace System.Net {
                                return(null);
                        }
 
-                       AddressFamily family=(AddressFamily)sockaddr[0];
+                       AddressFamily family = sockaddr.Family;
                        int port;
 
                        IPEndPoint ipe = null;
                        switch(family)
-                       {\r
-                               case AddressFamily.InterNetwork:\r
+                       {
+                               case AddressFamily.InterNetwork:
+                                       if (size < 8) {
+                                               return(null);
+                                       }
+                                       
                                        port = (((int)sockaddr[2])<<8) + (int)sockaddr[3];
                                        long address=(((long)sockaddr[7])<<24) +
                                                (((long)sockaddr[6])<<16) +
                                                (((long)sockaddr[5])<<8) +
                                                (long)sockaddr[4];
 
-                                       ipe = new IPEndPoint(address, port);\r
-                                       break;\r
-#if NET_1_1\r
-                               case AddressFamily.InterNetworkV6:\r
+                                       ipe = new IPEndPoint(address, port);
+                                       break;
+#if NET_1_1
+                               case AddressFamily.InterNetworkV6:
+                                       if (size < 28) {
+                                               return(null);
+                                       }
+                                       
                                        port    = (((int)sockaddr[2])<<8) + (int)sockaddr[3];
 
                                        /// maybe flowid ?
@@ -132,11 +140,11 @@ namespace System.Net {
                                        for(int i=0; i<8; i++)
                                                addressData[i] = (ushort)((sockaddr[8+i*2] << 8) + sockaddr[8+i*2+1]);
 
-                                       ipe = new IPEndPoint (new IPAddress(addressData, scopeId), port);\r
-                                       break;\r
-#endif\r
-                               default:\r
-                                       return null;\r
+                                       ipe = new IPEndPoint (new IPAddress(addressData, scopeId), port);
+                                       break;
+#endif
+                               default:
+                                       return null;
                        }
 
                        return(ipe);
@@ -146,8 +154,8 @@ namespace System.Net {
                        SocketAddress sockaddr = null;
 
                        switch (address.AddressFamily)
-                       {\r
-                               case AddressFamily.InterNetwork:\r
+                       {
+                               case AddressFamily.InterNetwork:
                                        // .net produces a 16 byte buffer, even though
                                        // only 8 bytes are used. I guess its just a
                                        // holdover from struct sockaddr padding.
@@ -162,9 +170,9 @@ namespace System.Net {
                                        sockaddr [5] = (byte) ((addr >> 8) & 0xff);
                                        sockaddr [6] = (byte) ((addr >> 16) & 0xff);
                                        sockaddr [7] = (byte) ((addr >> 24) & 0xff);
-                                       break;\r
-#if NET_1_1\r
-                               case AddressFamily.InterNetworkV6:\r
+                                       break;
+#if NET_1_1
+                               case AddressFamily.InterNetworkV6:
                                        sockaddr = new SocketAddress(AddressFamily.InterNetworkV6, 28);
 
                                        sockaddr [2] = (byte) ((port>>8) & 0xff);
@@ -177,9 +185,9 @@ namespace System.Net {
                                        sockaddr [24] = (byte) (address.ScopeId & 0xff);
                                        sockaddr [25] = (byte) ((address.ScopeId >> 8) & 0xff);
                                        sockaddr [26] = (byte) ((address.ScopeId >> 16) & 0xff);
-                                       sockaddr [27] = (byte) ((address.ScopeId >> 24) & 0xff);\r
-                                       break;\r
-#endif\r
+                                       sockaddr [27] = (byte) ((address.ScopeId >> 24) & 0xff);
+                                       break;
+#endif
                        }
 
                        return(sockaddr);