Merge remote branch 'upstream/master'
[mono.git] / mcs / class / System / System.Net / IPEndPoint.cs
old mode 100755 (executable)
new mode 100644 (file)
index 2e81c62..3aa2b18
@@ -43,14 +43,16 @@ namespace System.Net {
                public IPEndPoint (IPAddress address, int port)
                {
                        if (address == null)
-                               throw new ArgumentNullException ("Value cannot be null");
+                               throw new ArgumentNullException ("address");
 
                        Address = address;
                        Port = port;
                }
                
-               public IPEndPoint (long iaddr, int port) : this (new IPAddress (iaddr), port)
+               public IPEndPoint (long iaddr, int port)
                {
+                       Address = new IPAddress (iaddr);
+                       Port = port;
                }
 
                public IPAddress Address {
@@ -84,35 +86,43 @@ namespace System.Net {
 
                // bytes 2 and 3 store the port, the rest
                // stores the address
-               public override EndPoint Create(SocketAddress sockaddr) {
-                       int size=sockaddr.Size;
-                       
-                       // LAMESPEC: no mention of what to do if
-                       // sockaddr is bogus
-                       if(size<8) {
-                               // absolute minimum amount needed for
-                               // an address family, buffer size,
-                               // port and address
-                               return(null);
-                       }
+               public override EndPoint Create (SocketAddress socketAddress)
+               {
+                       if (socketAddress == null)
+                               throw new ArgumentNullException ("socketAddress");
 
-                       AddressFamily family=(AddressFamily)sockaddr[0];
+                       if (socketAddress.Family != AddressFamily)
+                               throw new ArgumentException ("The IPEndPoint was created using " + AddressFamily + 
+                                               " AddressFamily but SocketAddress contains " + socketAddress.Family + 
+                                               " instead, please use the same type.");
+
+                       SocketAddress sockaddr = socketAddress;
+                       int size =sockaddr.Size;
+                       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 +142,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 +156,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 +172,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 +187,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);