From cfcb23d0da5893a7dd4c88bce8b4ca1798e5c645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marie=20P=C3=ADchov=C3=A1?= Date: Tue, 3 Mar 2020 17:07:08 +0100 Subject: [PATCH] Fixed heap corruption by ensuring that FreeHGlobal is called only once even in multi-threaded and multiple Dispose calls. --- .../src/System/Net/Windows/RequestContextBase.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/RequestContextBase.cs b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/RequestContextBase.cs index c92a66840df5c5..9dfab0c8447d50 100644 --- a/src/libraries/System.Net.HttpListener/src/System/Net/Windows/RequestContextBase.cs +++ b/src/libraries/System.Net.HttpListener/src/System/Net/Windows/RequestContextBase.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.Runtime.InteropServices; +using System.Threading; namespace System.Net { @@ -49,10 +50,10 @@ public void Dispose() protected virtual void Dispose(bool disposing) { - if (_backingBuffer != IntPtr.Zero) + IntPtr backingBuffer = Interlocked.Exchange(ref _backingBuffer, IntPtr.Zero); + if (backingBuffer != IntPtr.Zero) { - Marshal.FreeHGlobal(_backingBuffer); - _backingBuffer = IntPtr.Zero; + Marshal.FreeHGlobal(backingBuffer); } }