+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
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)
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 ?
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);
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.
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);
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);