From eaf046c576ebcd123b0d9b4c6ee59a8c3ae410c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Petryka?= <35800402+MichalPetryka@users.noreply.github.com> Date: Fri, 1 Mar 2024 02:36:54 +0100 Subject: [PATCH 1/2] Fix GC hole in Guid Found in #99130. --- .../System.Private.CoreLib/src/System/Guid.cs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Guid.cs b/src/libraries/System.Private.CoreLib/src/System/Guid.cs index b6946be5ec578b..7e3bb700263845 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Guid.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Guid.cs @@ -841,10 +841,6 @@ private static bool IsHexPrefix(ReadOnlySpan str, int i) => str[i] == '0' && (str[i + 1] | 0x20) == 'x'; - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static unsafe ReadOnlySpan AsBytes(in Guid source) => - new ReadOnlySpan(Unsafe.AsPointer(ref Unsafe.AsRef(in source)), sizeof(Guid)); - // Returns an unsigned byte array containing the GUID. public byte[] ToByteArray() { @@ -856,7 +852,7 @@ public byte[] ToByteArray() else { // slower path for BigEndian - Guid guid = new Guid(AsBytes(this), false); + Guid guid = new Guid(MemoryMarshal.AsBytes(new ReadOnlySpan(this)), false); MemoryMarshal.TryWrite(g, in guid); } return g; @@ -874,7 +870,7 @@ public byte[] ToByteArray(bool bigEndian) else { // slower path for Reverse - Guid guid = new Guid(AsBytes(this), bigEndian); + Guid guid = new Guid(MemoryMarshal.AsBytes(new ReadOnlySpan(this)), bigEndian); MemoryMarshal.TryWrite(g, in guid); } return g; @@ -893,7 +889,7 @@ public bool TryWriteBytes(Span destination) else { // slower path for BigEndian - Guid guid = new Guid(AsBytes(this), false); + Guid guid = new Guid(MemoryMarshal.AsBytes(new ReadOnlySpan(this)), false); MemoryMarshal.TryWrite(destination, in guid); } return true; @@ -915,7 +911,7 @@ public bool TryWriteBytes(Span destination, bool bigEndian, out int bytesW else { // slower path for Reverse - Guid guid = new Guid(AsBytes(this), bigEndian); + Guid guid = new Guid(MemoryMarshal.AsBytes(new ReadOnlySpan(this)), bigEndian); MemoryMarshal.TryWrite(destination, in guid); } bytesWritten = 16; From bfdbcae5ff0f4c6d6d35adaab11e9db2ae4819ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Petryka?= <35800402+MichalPetryka@users.noreply.github.com> Date: Fri, 1 Mar 2024 02:48:37 +0100 Subject: [PATCH 2/2] Add missing in --- src/libraries/System.Private.CoreLib/src/System/Guid.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Guid.cs b/src/libraries/System.Private.CoreLib/src/System/Guid.cs index 7e3bb700263845..911fb9f7184a30 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Guid.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Guid.cs @@ -852,7 +852,7 @@ public byte[] ToByteArray() else { // slower path for BigEndian - Guid guid = new Guid(MemoryMarshal.AsBytes(new ReadOnlySpan(this)), false); + Guid guid = new Guid(MemoryMarshal.AsBytes(new ReadOnlySpan(in this)), false); MemoryMarshal.TryWrite(g, in guid); } return g; @@ -870,7 +870,7 @@ public byte[] ToByteArray(bool bigEndian) else { // slower path for Reverse - Guid guid = new Guid(MemoryMarshal.AsBytes(new ReadOnlySpan(this)), bigEndian); + Guid guid = new Guid(MemoryMarshal.AsBytes(new ReadOnlySpan(in this)), bigEndian); MemoryMarshal.TryWrite(g, in guid); } return g; @@ -889,7 +889,7 @@ public bool TryWriteBytes(Span destination) else { // slower path for BigEndian - Guid guid = new Guid(MemoryMarshal.AsBytes(new ReadOnlySpan(this)), false); + Guid guid = new Guid(MemoryMarshal.AsBytes(new ReadOnlySpan(in this)), false); MemoryMarshal.TryWrite(destination, in guid); } return true; @@ -911,7 +911,7 @@ public bool TryWriteBytes(Span destination, bool bigEndian, out int bytesW else { // slower path for Reverse - Guid guid = new Guid(MemoryMarshal.AsBytes(new ReadOnlySpan(this)), bigEndian); + Guid guid = new Guid(MemoryMarshal.AsBytes(new ReadOnlySpan(in this)), bigEndian); MemoryMarshal.TryWrite(destination, in guid); } bytesWritten = 16;