From 883134401d2e6f009a6ec1506eb7f79821f50d74 Mon Sep 17 00:00:00 2001 From: wfurt Date: Tue, 1 Aug 2023 20:22:00 -0700 Subject: [PATCH 1/3] use approved SocketAddress API instead of internal access --- .../Unix/System.Native/Interop.Bind.cs | 2 +- .../Interop/Windows/WinSock/Interop.bind.cs | 9 +++- .../src/System/Net/IPEndPointExtensions.cs | 2 +- .../Net/Internals/IPEndPointExtensions.cs | 2 +- .../Common/src/System/Net/SocketAddress.cs | 50 +++++++++---------- .../src/System.Net.Sockets.csproj | 2 + .../src/System/Net/Sockets/Socket.Windows.cs | 7 +-- .../src/System/Net/Sockets/Socket.cs | 49 +++++++++++------- .../Net/Sockets/SocketAsyncEventArgs.Unix.cs | 4 +- .../Sockets/SocketAsyncEventArgs.Windows.cs | 11 ++-- .../src/System/Net/Sockets/SocketPal.Unix.cs | 17 +++---- .../System/Net/Sockets/SocketPal.Windows.cs | 4 +- 12 files changed, 90 insertions(+), 69 deletions(-) diff --git a/src/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs b/src/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs index f279f45cc4bde9..ede3ddc2a70ea3 100644 --- a/src/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs +++ b/src/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs @@ -10,6 +10,6 @@ internal static partial class Interop internal static partial class Sys { [LibraryImport(Libraries.SystemNative, EntryPoint = "SystemNative_Bind")] - internal static unsafe partial Error Bind(SafeHandle socket, ProtocolType socketProtocolType, byte* socketAddress, int socketAddressLen); + internal static partial Error Bind(SafeHandle socket, ProtocolType socketProtocolType, ReadOnlySpan socketAddress, int socketAddressLen); } } diff --git a/src/libraries/Common/src/Interop/Windows/WinSock/Interop.bind.cs b/src/libraries/Common/src/Interop/Windows/WinSock/Interop.bind.cs index 6d5f0d4840c6bc..158b8f5466e563 100644 --- a/src/libraries/Common/src/Interop/Windows/WinSock/Interop.bind.cs +++ b/src/libraries/Common/src/Interop/Windows/WinSock/Interop.bind.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; using System.Runtime.InteropServices; using System.Net.Sockets; @@ -9,9 +10,13 @@ internal static partial class Interop internal static partial class Winsock { [LibraryImport(Interop.Libraries.Ws2_32, SetLastError = true)] - internal static partial SocketError bind( + private static partial SocketError bind( SafeSocketHandle socketHandle, - byte[] socketAddress, + ReadOnlySpan socketAddress, int socketAddressSize); + + internal static SocketError bind( + SafeSocketHandle socketHandle, + ReadOnlySpan socketAddress) => bind(socketHandle, socketAddress, socketAddress.Length); } } diff --git a/src/libraries/Common/src/System/Net/IPEndPointExtensions.cs b/src/libraries/Common/src/System/Net/IPEndPointExtensions.cs index 2308d48c29671f..f1723a2361454b 100644 --- a/src/libraries/Common/src/System/Net/IPEndPointExtensions.cs +++ b/src/libraries/Common/src/System/Net/IPEndPointExtensions.cs @@ -6,7 +6,7 @@ namespace System.Net.Sockets { - internal static class IPEndPointExtensions + internal static partial class IPEndPointExtensions { public static IPAddress GetIPAddress(ReadOnlySpan socketAddressBuffer) { diff --git a/src/libraries/Common/src/System/Net/Internals/IPEndPointExtensions.cs b/src/libraries/Common/src/System/Net/Internals/IPEndPointExtensions.cs index 427144404260b4..590048a08912b6 100644 --- a/src/libraries/Common/src/System/Net/Internals/IPEndPointExtensions.cs +++ b/src/libraries/Common/src/System/Net/Internals/IPEndPointExtensions.cs @@ -5,7 +5,7 @@ namespace System.Net.Sockets { - internal static class IPEndPointExtensions + internal static partial class IPEndPointExtensions { public static Internals.SocketAddress Serialize(EndPoint endpoint) { diff --git a/src/libraries/Common/src/System/Net/SocketAddress.cs b/src/libraries/Common/src/System/Net/SocketAddress.cs index de7d69a87d84ea..8c844c3e0d8f72 100644 --- a/src/libraries/Common/src/System/Net/SocketAddress.cs +++ b/src/libraries/Common/src/System/Net/SocketAddress.cs @@ -29,8 +29,8 @@ class SocketAddress : System.IEquatable internal static readonly int MaxAddressSize = SocketAddressPal.MaxAddressSize; #pragma warning restore CA1802 - internal int InternalSize; - internal byte[] InternalBuffer; + private int _size; + private byte[] _buffer; private const int MinSize = 2; private const int DataOffset = 2; @@ -39,7 +39,7 @@ public AddressFamily Family { get { - return SocketAddressPal.GetAddressFamily(InternalBuffer); + return SocketAddressPal.GetAddressFamily(_buffer); } } @@ -47,13 +47,13 @@ public int Size { get { - return InternalSize; + return _size; } set { - ArgumentOutOfRangeException.ThrowIfGreaterThan(value, InternalBuffer.Length); + ArgumentOutOfRangeException.ThrowIfGreaterThan(value, _buffer.Length); ArgumentOutOfRangeException.ThrowIfLessThan(value, MinSize); - InternalSize = value; + _size = value; } } @@ -69,7 +69,7 @@ public byte this[int offset] { throw new IndexOutOfRangeException(); } - return InternalBuffer[offset]; + return _buffer[offset]; } set { @@ -77,7 +77,7 @@ public byte this[int offset] { throw new IndexOutOfRangeException(); } - InternalBuffer[offset] = value; + _buffer[offset] = value; } } @@ -97,11 +97,11 @@ public SocketAddress(AddressFamily family, int size) { ArgumentOutOfRangeException.ThrowIfLessThan(size, MinSize); - InternalSize = size; - InternalBuffer = new byte[size]; - InternalBuffer[0] = (byte)InternalSize; + _size = size; + _buffer = new byte[size]; + _buffer[0] = (byte)_size; - SocketAddressPal.SetAddressFamily(InternalBuffer, family); + SocketAddressPal.SetAddressFamily(_buffer, family); } internal SocketAddress(IPAddress ipAddress) @@ -110,7 +110,7 @@ internal SocketAddress(IPAddress ipAddress) { // No Port. - SocketAddressPal.SetPort(InternalBuffer, 0); + SocketAddressPal.SetPort(_buffer, 0); if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6) { @@ -118,7 +118,7 @@ internal SocketAddress(IPAddress ipAddress) ipAddress.TryWriteBytes(addressBytes, out int bytesWritten); Debug.Assert(bytesWritten == IPAddressParserStatics.IPv6AddressBytes); - SocketAddressPal.SetIPv6Address(InternalBuffer, addressBytes, (uint)ipAddress.ScopeId); + SocketAddressPal.SetIPv6Address(_buffer, addressBytes, (uint)ipAddress.ScopeId); } else { @@ -127,21 +127,21 @@ internal SocketAddress(IPAddress ipAddress) #pragma warning restore CS0618 Debug.Assert(ipAddress.AddressFamily == AddressFamily.InterNetwork); - SocketAddressPal.SetIPv4Address(InternalBuffer, address); + SocketAddressPal.SetIPv4Address(_buffer, address); } } internal SocketAddress(IPAddress ipaddress, int port) : this(ipaddress) { - SocketAddressPal.SetPort(InternalBuffer, unchecked((ushort)port)); + SocketAddressPal.SetPort(_buffer, unchecked((ushort)port)); } internal SocketAddress(AddressFamily addressFamily, ReadOnlySpan buffer) { - InternalBuffer = buffer.ToArray(); - InternalSize = InternalBuffer.Length; - SocketAddressPal.SetAddressFamily(InternalBuffer, addressFamily); + _buffer = buffer.ToArray(); + _size = _buffer.Length; + SocketAddressPal.SetAddressFamily(_buffer, addressFamily); } /// This represents underlying memory that can be passed to native OS calls. @@ -152,7 +152,7 @@ public Memory Buffer { get { - return new Memory(InternalBuffer, 0, InternalSize); + return new Memory(_buffer, 0, _size); } } @@ -164,14 +164,14 @@ internal IPAddress GetIPAddress() Span address = stackalloc byte[IPAddressParserStatics.IPv6AddressBytes]; uint scope; - SocketAddressPal.GetIPv6Address(InternalBuffer, address, out scope); + SocketAddressPal.GetIPv6Address(_buffer, address, out scope); return new IPAddress(address, (long)scope); } else if (Family == AddressFamily.InterNetwork) { Debug.Assert(Size >= IPv4AddressSize); - long address = (long)SocketAddressPal.GetIPv4Address(InternalBuffer) & 0x0FFFFFFFF; + long address = (long)SocketAddressPal.GetIPv4Address(_buffer) & 0x0FFFFFFFF; return new IPAddress(address); } else @@ -184,7 +184,7 @@ internal IPAddress GetIPAddress() } } - internal int GetPort() => (int)SocketAddressPal.GetPort(InternalBuffer); + internal int GetPort() => (int)SocketAddressPal.GetPort(_buffer); internal IPEndPoint GetIPEndPoint() { @@ -199,7 +199,7 @@ public override bool Equals(object? comparand) => public override int GetHashCode() { HashCode hash = default; - hash.AddBytes(new ReadOnlySpan(InternalBuffer, 0, InternalSize)); + hash.AddBytes(new ReadOnlySpan(_buffer, 0, _size)); return hash.ToHashCode(); } @@ -234,7 +234,7 @@ public override string ToString() result[length++] = ':'; result[length++] = '{'; - byte[] buffer = InternalBuffer; + byte[] buffer = _buffer; for (int i = DataOffset; i < Size; i++) { if (i > DataOffset) diff --git a/src/libraries/System.Net.Sockets/src/System.Net.Sockets.csproj b/src/libraries/System.Net.Sockets/src/System.Net.Sockets.csproj index 457d8917166360..d013d5e706452f 100644 --- a/src/libraries/System.Net.Sockets/src/System.Net.Sockets.csproj +++ b/src/libraries/System.Net.Sockets/src/System.Net.Sockets.csproj @@ -59,6 +59,8 @@ + buffer = stackalloc byte[SocketAddress.GetMaximumAddressSize(_addressFamily)]; + int size = buffer.Length; + // This may throw ObjectDisposedException. unsafe { - fixed (byte* buffer = socketAddress.InternalBuffer) - fixed (int* bufferSize = &socketAddress.InternalSize) + fixed (byte* ptr = &MemoryMarshal.GetReference(buffer)) { - // This may throw ObjectDisposedException. - SocketError errorCode = SocketPal.GetSockName(_handle, buffer, bufferSize); + SocketError errorCode = SocketPal.GetSockName(_handle, ptr, &size); if (errorCode != SocketError.Success) { UpdateStatusAfterSocketErrorAndThrowException(errorCode); } } } - _localEndPoint = _rightEndPoint.Create(socketAddress); + + if (_addressFamily == AddressFamily.InterNetwork || _addressFamily == AddressFamily.InterNetworkV6) + { + _localEndPoint = IPEndPointExtensions.CreateIPEndPoint(buffer.Slice(0, size)); + } + else + { + SocketAddress socketAddress = new SocketAddress(_rightEndPoint.AddressFamily, size); + buffer.Slice(0, size).CopyTo(socketAddress.Buffer.Span); + _localEndPoint = _rightEndPoint.Create(socketAddress); + } } return _localEndPoint; @@ -338,17 +349,13 @@ public EndPoint? RemoteEndPoint return null; } - Internals.SocketAddress socketAddress = - _addressFamily == AddressFamily.InterNetwork || _addressFamily == AddressFamily.InterNetworkV6 ? - IPEndPointExtensions.Serialize(_rightEndPoint) : - new Internals.SocketAddress(_addressFamily, SocketPal.MaximumAddressSize); // may be different size than _rightEndPoint. - + Span buffer = stackalloc byte[SocketAddress.GetMaximumAddressSize(_addressFamily)]; + int size = buffer.Length; // This may throw ObjectDisposedException. SocketError errorCode = SocketPal.GetPeerName( _handle, - socketAddress.InternalBuffer, - ref socketAddress.InternalSize); - + buffer, + ref size); if (errorCode != SocketError.Success) { UpdateStatusAfterSocketErrorAndThrowException(errorCode); @@ -356,7 +363,16 @@ public EndPoint? RemoteEndPoint try { - _remoteEndPoint = _rightEndPoint.Create(socketAddress); + if (_addressFamily == AddressFamily.InterNetwork || _addressFamily == AddressFamily.InterNetworkV6) + { + _remoteEndPoint = IPEndPointExtensions.CreateIPEndPoint(buffer.Slice(0, size)); + } + else + { + SocketAddress socketAddress = new SocketAddress(_rightEndPoint.AddressFamily, size); + buffer.Slice(0, size).CopyTo(socketAddress.Buffer.Span); + _remoteEndPoint = _rightEndPoint.Create(socketAddress); + } } catch { @@ -765,8 +781,7 @@ private void DoBind(EndPoint endPointSnapshot, Internals.SocketAddress socketAdd SocketError errorCode = SocketPal.Bind( _handle, _protocolType, - socketAddress.InternalBuffer, - socketAddress.Size); + socketAddress.Buffer.Span); // Throw an appropriate SocketException if the native call fails. if (errorCode != SocketError.Success) diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs index 194f9ad6fc7279..e7de1f98ddef52 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs @@ -331,7 +331,9 @@ internal void LogBuffer(int size) private SocketError FinishOperationAccept(Internals.SocketAddress remoteSocketAddress) { - System.Buffer.BlockCopy(_acceptBuffer!, 0, remoteSocketAddress.InternalBuffer, 0, _acceptAddressBufferCount); + new ReadOnlySpan(_acceptBuffer!, 0, _acceptAddressBufferCount).CopyTo(remoteSocketAddress.Buffer.Span); + remoteSocketAddress.Size = _acceptAddressBufferCount; + Socket acceptedSocket = _currentSocket!.CreateAcceptSocket( SocketPal.CreateSocket(_acceptedFileDescriptor), _currentSocket._rightEndPoint!.Create(remoteSocketAddress)); diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Windows.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Windows.cs index 51bfac58f0e8e6..2aa782d826cac4 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Windows.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Windows.cs @@ -302,7 +302,7 @@ internal unsafe SocketError DoOperationConnectEx(Socket socket, SafeSocketHandle { bool success = socket.ConnectEx( handle, - _socketAddress!.InternalBuffer.AsSpan(), + _socketAddress!.Buffer.Span, (IntPtr)(bufferPtr + _offset), _count, out int bytesTransferred, @@ -762,7 +762,7 @@ internal unsafe SocketError DoOperationSendToSingleBuffer(SafeSocketHandle handl 1, out int bytesTransferred, _socketFlags, - _socketAddress!.InternalBuffer.AsSpan(), + _socketAddress!.Buffer.Span, overlapped, IntPtr.Zero); @@ -789,7 +789,7 @@ internal unsafe SocketError DoOperationSendToMultiBuffer(SafeSocketHandle handle _bufferListInternal!.Count, out int bytesTransferred, _socketFlags, - _socketAddress!.InternalBuffer.AsSpan(), + _socketAddress!.Buffer.Span, overlapped, IntPtr.Zero); @@ -1058,10 +1058,11 @@ private unsafe SocketError FinishOperationAccept(Internals.SocketAddress remoteS out localAddr, out localAddrLength, out remoteAddr, - out remoteSocketAddress.InternalSize + out int size ); - Marshal.Copy(remoteAddr, remoteSocketAddress.InternalBuffer, 0, remoteSocketAddress.Size); + new ReadOnlySpan((void*)remoteAddr, size).CopyTo(remoteSocketAddress.Buffer.Span); + remoteSocketAddress.Size = size; } socketError = Interop.Winsock.setsockopt( diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs index 06ce39380a4b8d..b9fdc0b5157fa1 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs @@ -1089,13 +1089,9 @@ public static unsafe SocketError GetPeerName(SafeSocketHandle handle, Span return err == Interop.Error.SUCCESS ? SocketError.Success : GetSocketErrorForErrorCode(err); } - public static unsafe SocketError Bind(SafeSocketHandle handle, ProtocolType socketProtocolType, byte[] buffer, int nameLen) + public static unsafe SocketError Bind(SafeSocketHandle handle, ProtocolType socketProtocolType, ReadOnlySpan buffer) { - Interop.Error err; - fixed (byte* rawBuffer = buffer) - { - err = Interop.Sys.Bind(handle, socketProtocolType, rawBuffer, nameLen); - } + Interop.Error err = Interop.Sys.Bind(handle, socketProtocolType, buffer, buffer.Length); return err == Interop.Error.SUCCESS ? SocketError.Success : GetSocketErrorForErrorCode(err); } @@ -1297,7 +1293,7 @@ public static SocketError ReceiveMessageFrom(Socket socket, SafeSocketHandle han } } - socketAddress.InternalSize = socketAddressLen; + socketAddress.Size = socketAddressLen; receiveAddress = socketAddress; return errorCode; } @@ -1305,7 +1301,6 @@ public static SocketError ReceiveMessageFrom(Socket socket, SafeSocketHandle han public static SocketError ReceiveMessageFrom(Socket socket, SafeSocketHandle handle, Span buffer, ref SocketFlags socketFlags, Internals.SocketAddress socketAddress, out Internals.SocketAddress receiveAddress, out IPPacketInformation ipPacketInformation, out int bytesTransferred) { - byte[] socketAddressBuffer = socketAddress.InternalBuffer; int socketAddressLen; bool isIPv4, isIPv6; @@ -1314,17 +1309,17 @@ public static SocketError ReceiveMessageFrom(Socket socket, SafeSocketHandle han SocketError errorCode; if (!handle.IsNonBlocking) { - errorCode = handle.AsyncContext.ReceiveMessageFrom(buffer, ref socketFlags, socketAddressBuffer, out socketAddressLen, isIPv4, isIPv6, handle.ReceiveTimeout, out ipPacketInformation, out bytesTransferred); + errorCode = handle.AsyncContext.ReceiveMessageFrom(buffer, ref socketFlags, socketAddress.Buffer, out socketAddressLen, isIPv4, isIPv6, handle.ReceiveTimeout, out ipPacketInformation, out bytesTransferred); } else { - if (!TryCompleteReceiveMessageFrom(handle, buffer, null, socketFlags, socketAddressBuffer, out socketAddressLen, isIPv4, isIPv6, out bytesTransferred, out socketFlags, out ipPacketInformation, out errorCode)) + if (!TryCompleteReceiveMessageFrom(handle, buffer, null, socketFlags, socketAddress.Buffer, out socketAddressLen, isIPv4, isIPv6, out bytesTransferred, out socketFlags, out ipPacketInformation, out errorCode)) { errorCode = SocketError.WouldBlock; } } - socketAddress.InternalSize = socketAddressLen; + socketAddress.Size = socketAddressLen; receiveAddress = socketAddress; return errorCode; } diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Windows.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Windows.cs index 7ab0a867e64c7b..b474447132d72b 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Windows.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Windows.cs @@ -164,9 +164,9 @@ public static unsafe SocketError GetPeerName(SafeSocketHandle handle, Span } } - public static SocketError Bind(SafeSocketHandle handle, ProtocolType _ /*socketProtocolType*/, byte[] buffer, int nameLen) + public static SocketError Bind(SafeSocketHandle handle, ProtocolType _ /*socketProtocolType*/, ReadOnlySpan buffer) { - SocketError errorCode = Interop.Winsock.bind(handle, buffer, nameLen); + SocketError errorCode = Interop.Winsock.bind(handle, buffer); return errorCode == SocketError.SocketError ? GetLastSocketError() : SocketError.Success; } From 7a9040d98a381f86cf48ee4512ec352ef3962fd9 Mon Sep 17 00:00:00 2001 From: wfurt Date: Wed, 2 Aug 2023 18:16:01 -0700 Subject: [PATCH 2/3] feedback --- .../Common/src/Interop/Unix/System.Native/Interop.Bind.cs | 6 +++++- .../src/System/Net/Sockets/Socket.Windows.cs | 2 +- .../System.Net.Sockets/src/System/Net/Sockets/Socket.cs | 2 +- .../src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs | 2 +- .../src/System/Net/Sockets/SocketPal.Unix.cs | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs b/src/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs index ede3ddc2a70ea3..0c1f1b50bd8fc9 100644 --- a/src/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs +++ b/src/libraries/Common/src/Interop/Unix/System.Native/Interop.Bind.cs @@ -10,6 +10,10 @@ internal static partial class Interop internal static partial class Sys { [LibraryImport(Libraries.SystemNative, EntryPoint = "SystemNative_Bind")] - internal static partial Error Bind(SafeHandle socket, ProtocolType socketProtocolType, ReadOnlySpan socketAddress, int socketAddressLen); + private static partial Error Bind(SafeHandle socket, ProtocolType socketProtocolType, ReadOnlySpan socketAddress, int socketAddressLen); + + internal static Error Bind( + SafeHandle socket, ProtocolType socketProtocolType, ReadOnlySpan socketAddress) + => Bind(socket, socketProtocolType, socketAddress, socketAddress.Length); } } diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Windows.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Windows.cs index d5583915efd589..8eae5f877b9ab3 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Windows.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.Windows.cs @@ -71,7 +71,7 @@ public Socket(SocketInformation socketInformation) IPEndPoint ep = new IPEndPoint(tempAddress, 0); Internals.SocketAddress socketAddress = IPEndPointExtensions.Serialize(ep); - int size = socketAddress.Size; + int size = socketAddress.Buffer.Length; unsafe { fixed (byte* bufferPtr = socketAddress.Buffer.Span) diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs index 34d3adb3083854..d54fac57d6c9c8 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @@ -303,12 +303,12 @@ public EndPoint? LocalEndPoint { Span buffer = stackalloc byte[SocketAddress.GetMaximumAddressSize(_addressFamily)]; int size = buffer.Length; - // This may throw ObjectDisposedException. unsafe { fixed (byte* ptr = &MemoryMarshal.GetReference(buffer)) { + // This may throw ObjectDisposedException. SocketError errorCode = SocketPal.GetSockName(_handle, ptr, &size); if (errorCode != SocketError.Success) { diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs index e7de1f98ddef52..dd365322985e29 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs @@ -331,7 +331,7 @@ internal void LogBuffer(int size) private SocketError FinishOperationAccept(Internals.SocketAddress remoteSocketAddress) { - new ReadOnlySpan(_acceptBuffer!, 0, _acceptAddressBufferCount).CopyTo(remoteSocketAddress.Buffer.Span); + new ReadOnlySpan(_acceptBuffer, 0, _acceptAddressBufferCount).CopyTo(remoteSocketAddress.Buffer.Span); remoteSocketAddress.Size = _acceptAddressBufferCount; Socket acceptedSocket = _currentSocket!.CreateAcceptSocket( diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs index b9fdc0b5157fa1..c57639ff135482 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs @@ -1091,7 +1091,7 @@ public static unsafe SocketError GetPeerName(SafeSocketHandle handle, Span public static unsafe SocketError Bind(SafeSocketHandle handle, ProtocolType socketProtocolType, ReadOnlySpan buffer) { - Interop.Error err = Interop.Sys.Bind(handle, socketProtocolType, buffer, buffer.Length); + Interop.Error err = Interop.Sys.Bind(handle, socketProtocolType, buffer); return err == Interop.Error.SUCCESS ? SocketError.Success : GetSocketErrorForErrorCode(err); } From 5c7bb1507863ee4597b43bf91265edd9cce73268 Mon Sep 17 00:00:00 2001 From: wfurt Date: Thu, 3 Aug 2023 18:20:49 -0700 Subject: [PATCH 3/3] cleanup --- .../Interop/Windows/WinSock/Interop.WSASocketW.cs | 5 +---- .../System/Net/SocketProtocolSupportPal.Unix.cs | 1 - .../System/Net/SocketProtocolSupportPal.Windows.cs | 5 +---- .../src/System/Net/SocketProtocolSupportPal.cs | 2 ++ .../src/System.Net.NameResolution.csproj | 10 +--------- .../src/System/Net/Dns.cs | 1 - .../src/System/Net/NameResolutionPal.Unix.cs | 1 - .../System.Net.Ping/src/System.Net.Ping.csproj | 14 ++++---------- 8 files changed, 9 insertions(+), 30 deletions(-) diff --git a/src/libraries/Common/src/Interop/Windows/WinSock/Interop.WSASocketW.cs b/src/libraries/Common/src/Interop/Windows/WinSock/Interop.WSASocketW.cs index 45f8612ce79532..4c992fa0f455a4 100644 --- a/src/libraries/Common/src/Interop/Windows/WinSock/Interop.WSASocketW.cs +++ b/src/libraries/Common/src/Interop/Windows/WinSock/Interop.WSASocketW.cs @@ -4,9 +4,6 @@ using System; using System.Net.Sockets; using System.Runtime.InteropServices; -#if !SYSTEM_NET_SOCKETS_DLL -using SocketType = System.Net.Internals.SocketType; -#endif internal static partial class Interop { @@ -15,7 +12,7 @@ internal static partial class Winsock [LibraryImport(Interop.Libraries.Ws2_32, SetLastError = true, StringMarshalling = StringMarshalling.Utf16)] internal static partial IntPtr WSASocketW( AddressFamily addressFamily, - SocketType socketType, + int socketType, int protocolType, IntPtr protocolInfo, int group, diff --git a/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Unix.cs b/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Unix.cs index 0e6e96a4dd20db..a7115c9f2539b5 100644 --- a/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Unix.cs +++ b/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Unix.cs @@ -8,7 +8,6 @@ namespace System.Net { internal static partial class SocketProtocolSupportPal { - private const int DgramSocketType = 2; private static unsafe bool IsSupported(AddressFamily af) { // Check for AF_UNIX on iOS/tvOS. The OS claims to support this, but returns EPERM on bind. diff --git a/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Windows.cs b/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Windows.cs index bd45be3f4759e2..4cc5ffc33b45be 100644 --- a/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Windows.cs +++ b/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.Windows.cs @@ -3,9 +3,6 @@ using System.Net.Sockets; using System.Runtime.InteropServices; -#if !SYSTEM_NET_SOCKETS_DLL -using SocketType = System.Net.Internals.SocketType; -#endif namespace System.Net { @@ -19,7 +16,7 @@ private static bool IsSupported(AddressFamily af) IntPtr socket = INVALID_SOCKET; try { - socket = Interop.Winsock.WSASocketW(af, SocketType.Stream, 0, IntPtr.Zero, 0, (int)Interop.Winsock.SocketConstructorFlags.WSA_FLAG_NO_HANDLE_INHERIT); + socket = Interop.Winsock.WSASocketW(af, DgramSocketType, 0, IntPtr.Zero, 0, (int)Interop.Winsock.SocketConstructorFlags.WSA_FLAG_NO_HANDLE_INHERIT); return socket != INVALID_SOCKET || (SocketError)Marshal.GetLastPInvokeError() != SocketError.AddressFamilyNotSupported; diff --git a/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.cs b/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.cs index a61f47a0fa458d..d6906e3b5c1d47 100644 --- a/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.cs +++ b/src/libraries/Common/src/System/Net/SocketProtocolSupportPal.cs @@ -14,6 +14,8 @@ internal static partial class SocketProtocolSupportPal public static bool OSSupportsIPv4 { get; } = IsSupported(AddressFamily.InterNetwork); public static bool OSSupportsUnixDomainSockets { get; } = IsSupported(AddressFamily.Unix); + private const int DgramSocketType = 2; + private static bool IsIPv6Disabled() { // First check for the AppContext switch, giving it priority over the environment variable. diff --git a/src/libraries/System.Net.NameResolution/src/System.Net.NameResolution.csproj b/src/libraries/System.Net.NameResolution/src/System.Net.NameResolution.csproj index e064468578801b..430e8303e1b75d 100644 --- a/src/libraries/System.Net.NameResolution/src/System.Net.NameResolution.csproj +++ b/src/libraries/System.Net.NameResolution/src/System.Net.NameResolution.csproj @@ -21,14 +21,8 @@ - - - @@ -37,9 +31,7 @@ - - + - - - - @@ -40,8 +32,6 @@ - + +