diff --git a/BuildToolsVersion.txt b/BuildToolsVersion.txt index eb6df085b9a3..6b4d62514170 100644 --- a/BuildToolsVersion.txt +++ b/BuildToolsVersion.txt @@ -1 +1 @@ -2.1.0-rc1-02913-01 +2.1.0-rc1-03006-01 diff --git a/build.proj b/build.proj index b1a793952c03..95aec47afe06 100644 --- a/build.proj +++ b/build.proj @@ -29,9 +29,15 @@ - + GenerateConfigurationProperties; - CreateOrUpdateCurrentVersionFile; + CreateOrUpdateCurrentVersionFile + + + + + + $(PrebuildSetupTargets); $(TraversalBuildDependsOn); @@ -42,7 +48,7 @@ - + diff --git a/dependencies.props b/dependencies.props index 43877884e1fa..18e141d2783b 100644 --- a/dependencies.props +++ b/dependencies.props @@ -9,15 +9,15 @@ These ref versions are pulled from https://github.com/dotnet/versions. --> - 11f431e6bd908d5fdd94c187d2741d9c40a4287d - 11f431e6bd908d5fdd94c187d2741d9c40a4287d - 11f431e6bd908d5fdd94c187d2741d9c40a4287d + b933a1ea9efa451dc6e06da2920f1c93253160b2 + b933a1ea9efa451dc6e06da2920f1c93253160b2 + b933a1ea9efa451dc6e06da2920f1c93253160b2 96dc7805f5df4a70a55783964ce69dcd91bfca80 ccd922b62227c43ed2dac6bcb737321dd2b07be0 ccd922b62227c43ed2dac6bcb737321dd2b07be0 8bd1ec5fac9f0eec34ff6b34b1d878b4359e02dd c520a2569b40fc53cf51e4f6970c3e7411adc173 - d1e2bedf58a4a66aadda4f5751ecdaf3ad4f62fe + 8fc22d261883eb7a1f8765bfe716d806303d0318 @@ -31,15 +31,15 @@ - servicing - 2.1.0 - 2.1.1-servicing-26606-02 + servicing-26708-02 + 2.1.1-servicing-26708-02 + 2.1.3-servicing-26708-02 beta-26413-00 beta-26413-00 1.0.0-beta-26413-00 - 2.1.1 - 2.1.1 - 2.1.1 + 2.1.3-servicing-26708-02 + 2.1.3-servicing-26708-02 + 2.1.3-servicing-26708-02 4.4.0 @@ -47,7 +47,7 @@ 1.0.3-prerelease-00921-01 1.0.0-beta-build0019 2.0.5 - 2.1.0-rc1-02913-01 + 2.1.0-rc1-03006-01 2.0.0-rc-61101-17 @@ -56,7 +56,7 @@ Microsoft.DotNet.Build.Tasks.Feed - 2.1.0-rc1-02913-01 + 2.1.0-rc1-03006-01 diff --git a/dir.targets b/dir.targets index 2bf1e4371d35..5bc52a85093a 100644 --- a/dir.targets +++ b/dir.targets @@ -93,6 +93,15 @@ + + + true + true + + diff --git a/pkg/Microsoft.NETCore.Platforms/runtime.compatibility.json b/pkg/Microsoft.NETCore.Platforms/runtime.compatibility.json index b65524646390..1c537ddfe56a 100644 --- a/pkg/Microsoft.NETCore.Platforms/runtime.compatibility.json +++ b/pkg/Microsoft.NETCore.Platforms/runtime.compatibility.json @@ -4641,6 +4641,33 @@ "any", "base" ], + "tizen-x86": [ + "tizen-x86", + "tizen", + "linux-x86", + "linux", + "unix-x86", + "unix", + "any", + "base" + ], + "tizen-x86-corert": [ + "tizen-x86-corert", + "tizen-corert", + "tizen-x86", + "linux-x86-corert", + "tizen", + "linux-corert", + "linux-x86", + "unix-x86-corert", + "linux", + "unix-corert", + "unix-x86", + "unix", + "corert", + "any", + "base" + ], "tizen.4.0.0": [ "tizen.4.0.0", "tizen", @@ -4695,6 +4722,141 @@ "any", "base" ], + "tizen.4.0.0-x86": [ + "tizen.4.0.0-x86", + "tizen.4.0.0", + "tizen-x86", + "tizen", + "linux-x86", + "linux", + "unix-x86", + "unix", + "any", + "base" + ], + "tizen.4.0.0-x86-corert": [ + "tizen.4.0.0-x86-corert", + "tizen.4.0.0-corert", + "tizen.4.0.0-x86", + "tizen.4.0.0", + "tizen-x86-corert", + "tizen-corert", + "tizen-x86", + "tizen", + "linux-x86-corert", + "linux-corert", + "linux-x86", + "linux", + "unix-x86-corert", + "unix-corert", + "unix-x86", + "unix", + "corert", + "any", + "base" + ], + "tizen.5.0.0": [ + "tizen.5.0.0", + "tizen.4.0.0", + "tizen", + "linux", + "unix", + "any", + "base" + ], + "tizen.5.0.0-armel": [ + "tizen.5.0.0-armel", + "tizen.5.0.0", + "tizen.4.0.0-armel", + "tizen.4.0.0", + "tizen-armel", + "tizen", + "linux-armel", + "linux", + "unix-armel", + "unix", + "any", + "base" + ], + "tizen.5.0.0-armel-corert": [ + "tizen.5.0.0-armel-corert", + "tizen.5.0.0-corert", + "tizen.5.0.0-armel", + "tizen.5.0.0", + "tizen.4.0.0-armel-corert", + "tizen.4.0.0-corert", + "tizen.4.0.0-armel", + "tizen.4.0.0", + "tizen-armel-corert", + "tizen-corert", + "tizen-armel", + "tizen", + "linux-armel-corert", + "linux-corert", + "linux-armel", + "linux", + "unix-armel-corert", + "unix-corert", + "unix-armel", + "unix", + "corert", + "any", + "base" + ], + "tizen.5.0.0-corert": [ + "tizen.5.0.0-corert", + "tizen.5.0.0", + "tizen.4.0.0-corert", + "tizen.4.0.0", + "tizen-corert", + "tizen", + "linux-corert", + "linux", + "unix-corert", + "unix", + "corert", + "any", + "base" + ], + "tizen.5.0.0-x86": [ + "tizen.5.0.0-x86", + "tizen.5.0.0", + "tizen.4.0.0-x86", + "tizen.4.0.0", + "tizen-x86", + "tizen", + "linux-x86", + "linux", + "unix-x86", + "unix", + "any", + "base" + ], + "tizen.5.0.0-x86-corert": [ + "tizen.5.0.0-x86-corert", + "tizen.5.0.0-corert", + "tizen.5.0.0-x86", + "tizen.5.0.0", + "tizen.4.0.0-x86-corert", + "tizen.4.0.0-corert", + "tizen.4.0.0-x86", + "tizen.4.0.0", + "tizen-x86-corert", + "tizen-corert", + "tizen-x86", + "tizen", + "linux-x86-corert", + "linux-corert", + "linux-x86", + "linux", + "unix-x86-corert", + "unix-corert", + "unix-x86", + "unix", + "corert", + "any", + "base" + ], "ubuntu": [ "ubuntu", "debian", diff --git a/pkg/Microsoft.NETCore.Platforms/runtime.json b/pkg/Microsoft.NETCore.Platforms/runtime.json index 30f99f8e58e1..81cf1c7d0e0c 100644 --- a/pkg/Microsoft.NETCore.Platforms/runtime.json +++ b/pkg/Microsoft.NETCore.Platforms/runtime.json @@ -1817,6 +1817,19 @@ "linux-corert" ] }, + "tizen-x86": { + "#import": [ + "tizen", + "linux-x86" + ] + }, + "tizen-x86-corert": { + "#import": [ + "tizen-corert", + "tizen-x86", + "linux-x86-corert" + ] + }, "tizen.4.0.0": { "#import": [ "tizen" @@ -1842,6 +1855,59 @@ "tizen-corert" ] }, + "tizen.4.0.0-x86": { + "#import": [ + "tizen.4.0.0", + "tizen-x86" + ] + }, + "tizen.4.0.0-x86-corert": { + "#import": [ + "tizen.4.0.0-corert", + "tizen.4.0.0-x86", + "tizen.4.0.0", + "tizen-x86-corert" + ] + }, + "tizen.5.0.0": { + "#import": [ + "tizen.4.0.0" + ] + }, + "tizen.5.0.0-armel": { + "#import": [ + "tizen.5.0.0", + "tizen.4.0.0-armel" + ] + }, + "tizen.5.0.0-armel-corert": { + "#import": [ + "tizen.5.0.0-corert", + "tizen.5.0.0-armel", + "tizen.5.0.0", + "tizen.4.0.0-armel-corert" + ] + }, + "tizen.5.0.0-corert": { + "#import": [ + "tizen.5.0.0", + "tizen.4.0.0-corert" + ] + }, + "tizen.5.0.0-x86": { + "#import": [ + "tizen.5.0.0", + "tizen.4.0.0-x86" + ] + }, + "tizen.5.0.0-x86-corert": { + "#import": [ + "tizen.5.0.0-corert", + "tizen.5.0.0-x86", + "tizen.5.0.0", + "tizen.4.0.0-x86-corert" + ] + }, "ubuntu": { "#import": [ "debian" diff --git a/pkg/Microsoft.NETCore.Platforms/runtimeGroups.props b/pkg/Microsoft.NETCore.Platforms/runtimeGroups.props index c8898ed0bb49..6cee9f7aa10b 100644 --- a/pkg/Microsoft.NETCore.Platforms/runtimeGroups.props +++ b/pkg/Microsoft.NETCore.Platforms/runtimeGroups.props @@ -111,8 +111,8 @@ linux - armel - 4.0.0 + x86;armel + 4.0.0;5.0.0 diff --git a/pkg/Microsoft.Private.CoreFx.NETCoreApp/netcoreapp.rids.props b/pkg/Microsoft.Private.CoreFx.NETCoreApp/netcoreapp.rids.props index 06bdbc769641..520c72a119ef 100644 --- a/pkg/Microsoft.Private.CoreFx.NETCoreApp/netcoreapp.rids.props +++ b/pkg/Microsoft.Private.CoreFx.NETCoreApp/netcoreapp.rids.props @@ -28,5 +28,8 @@ armel + + armel + diff --git a/src/Native/Unix/System.Security.Cryptography.Native.Apple/CMakeLists.txt b/src/Native/Unix/System.Security.Cryptography.Native.Apple/CMakeLists.txt index 0ed02c6e9dfe..5049a5f4b7dc 100644 --- a/src/Native/Unix/System.Security.Cryptography.Native.Apple/CMakeLists.txt +++ b/src/Native/Unix/System.Security.Cryptography.Native.Apple/CMakeLists.txt @@ -26,6 +26,9 @@ set(NATIVECRYPTO_SOURCES pal_x509chain.cpp ) +# Temporary workaround for dotnet/corefx issue #30599 +add_compile_options(-Wno-deprecated-declarations) + add_library(System.Security.Cryptography.Native.Apple SHARED ${NATIVECRYPTO_SOURCES} diff --git a/src/Native/Unix/System.Security.Cryptography.Native.Apple/pal_x509chain.cpp b/src/Native/Unix/System.Security.Cryptography.Native.Apple/pal_x509chain.cpp index b84540339368..2d8cae14cc4a 100644 --- a/src/Native/Unix/System.Security.Cryptography.Native.Apple/pal_x509chain.cpp +++ b/src/Native/Unix/System.Security.Cryptography.Native.Apple/pal_x509chain.cpp @@ -186,7 +186,7 @@ static void MergeStatusCodes(CFTypeRef key, CFTypeRef value, void* context) // It doesn't represent a new error code, and we're still getting the old ones, so // just ignore it for now. } - else if (CFEqual(keyString, CFSTR("NonEmptySubject"))) + else if (CFEqual(keyString, CFSTR("NonEmptySubject")) || CFEqual(keyString, CFSTR("GrayListedKey"))) { // Not a "problem" that we report. } diff --git a/src/System.Console/src/System/ConsolePal.Unix.cs b/src/System.Console/src/System/ConsolePal.Unix.cs index 326a14e2b098..855aa55519ac 100644 --- a/src/System.Console/src/System/ConsolePal.Unix.cs +++ b/src/System.Console/src/System/ConsolePal.Unix.cs @@ -332,6 +332,13 @@ public static int CursorTop } } + /// + /// Tracks whether we've ever successfully received a response to a cursor position request (CPR). + /// If we have, then we can be more aggressive about expecting a response to subsequent requests, + /// e.g. using a longer timeout. + /// + private static bool s_everReceivedCursorPositionResponse; + /// Gets the current cursor position. This involves both writing to stdout and reading stdin. private static unsafe void GetCursorPosition(out int left, out int top) { @@ -358,7 +365,15 @@ private static unsafe void GetCursorPosition(out int left, out int top) // one thread's get_CursorLeft/Top from providing input to the other's Console.Read*. lock (StdInReader) { - Interop.Sys.InitializeConsoleBeforeRead(minChars: 0, decisecondsTimeout: 10); + // Because the CPR request/response protocol involves blocking until we get a certain + // response from the terminal, we want to avoid doing so if we don't know the terminal + // will definitely response. As such, we start with minChars == 0, which causes the + // terminal's read timer to start immediately. Once we've received a response for + // a request such that we know the terminal supports the protocol, we then specify + // minChars == 1. With that, the timer won't start until the first character is + // received. This makes the mechanism more reliable when there are high latencies + // involved in reading/writing, such as when accessing a remote system. + Interop.Sys.InitializeConsoleBeforeRead(minChars: (byte)(s_everReceivedCursorPositionResponse ? 1 : 0), decisecondsTimeout: 10); try { // Write out the cursor position report request. @@ -425,6 +440,9 @@ private static unsafe void GetCursorPosition(out int left, out int top) // else back into the StdInReader. ReadRowOrCol(bracketPos, semiPos, r, readBytes, ref top); ReadRowOrCol(semiPos, rPos, r, readBytes, ref left); + + // Mark that we've successfully received a CPR response at least once. + s_everReceivedCursorPositionResponse = true; } finally { diff --git a/src/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/HttpHandlerDiagnosticListener.cs b/src/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/HttpHandlerDiagnosticListener.cs index ec8feba0bcb5..bbfb87c05521 100644 --- a/src/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/HttpHandlerDiagnosticListener.cs +++ b/src/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/HttpHandlerDiagnosticListener.cs @@ -653,11 +653,12 @@ private bool IsLastResponse(HttpWebRequest request, HttpStatusCode statusCode) { if (request.AllowAutoRedirect) { - if (statusCode == HttpStatusCode.Ambiguous || // 300 - statusCode == HttpStatusCode.Moved || // 301 - statusCode == HttpStatusCode.Redirect || // 302 - statusCode == HttpStatusCode.RedirectMethod || // 303 - statusCode == HttpStatusCode.RedirectKeepVerb) // 307 + if (statusCode == HttpStatusCode.Ambiguous || // 300 + statusCode == HttpStatusCode.Moved || // 301 + statusCode == HttpStatusCode.Redirect || // 302 + statusCode == HttpStatusCode.RedirectMethod || // 303 + statusCode == HttpStatusCode.RedirectKeepVerb || // 307 + (int)statusCode == 308) // 308 Permanent Redirect is not in netfx yet, and so has to be specified this way. { return s_autoRedirectsAccessor(request) >= request.MaximumAutomaticRedirections; } diff --git a/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/RedirectHandler.cs b/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/RedirectHandler.cs index ede57cf9ca56..138bac21db78 100644 --- a/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/RedirectHandler.cs +++ b/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/RedirectHandler.cs @@ -81,6 +81,7 @@ private Uri GetUriForRedirect(Uri requestUri, HttpResponseMessage response) case HttpStatusCode.SeeOther: case HttpStatusCode.TemporaryRedirect: case HttpStatusCode.MultipleChoices: + case HttpStatusCode.PermanentRedirect: break; default: diff --git a/src/System.Net.Http/src/uap/System/Net/HttpHandlerToFilter.cs b/src/System.Net.Http/src/uap/System/Net/HttpHandlerToFilter.cs index 53e7b9b2bf20..693955680df3 100644 --- a/src/System.Net.Http/src/uap/System/Net/HttpHandlerToFilter.cs +++ b/src/System.Net.Http/src/uap/System/Net/HttpHandlerToFilter.cs @@ -116,7 +116,8 @@ protected internal override async Task SendAsync(HttpReques response.StatusCode != HttpStatusCode.MovedPermanently && response.StatusCode != HttpStatusCode.Redirect && response.StatusCode != HttpStatusCode.RedirectMethod && - response.StatusCode != HttpStatusCode.RedirectKeepVerb) + response.StatusCode != HttpStatusCode.RedirectKeepVerb && + response.StatusCode != HttpStatusCode.PermanentRedirect) { break; } @@ -151,10 +152,11 @@ protected internal override async Task SendAsync(HttpReques } // Follow HTTP RFC 7231 rules. In general, 3xx responses - // except for 307 will keep verb except POST becomes GET. - // 307 responses have all verbs stay the same. + // except for 307 and 308 will keep verb except POST becomes GET. + // 307 and 308 responses have all verbs stay the same. // https://tools.ietf.org/html/rfc7231#section-6.4 if (response.StatusCode != HttpStatusCode.RedirectKeepVerb && + response.StatusCode != HttpStatusCode.PermanentRedirect && requestHttpMethod == HttpMethod.Post) { requestHttpMethod = HttpMethod.Get; diff --git a/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.cs b/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.cs index 2d7a9c55b721..14960a11ea29 100644 --- a/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.cs +++ b/src/System.Net.Http/tests/FunctionalTests/HttpClientHandlerTest.cs @@ -62,7 +62,8 @@ public abstract class HttpClientHandlerTest : HttpClientTestBase new object[] { 301 }, new object[] { 302 }, new object[] { 303 }, - new object[] { 307 } + new object[] { 307 }, + new object[] { 308 } }; public static readonly object[][] RedirectStatusCodesOldMethodsNewMethods = { @@ -85,6 +86,10 @@ public abstract class HttpClientHandlerTest : HttpClientTestBase new object[] { 307, "GET", "GET" }, new object[] { 307, "POST", "POST" }, new object[] { 307, "HEAD", "HEAD" }, + + new object[] { 308, "GET", "GET" }, + new object[] { 308, "POST", "POST" }, + new object[] { 308, "HEAD", "HEAD" }, }; // Standard HTTP methods defined in RFC7231: http://tools.ietf.org/html/rfc7231#section-4.3 @@ -245,6 +250,12 @@ public async Task UseDefaultCredentials_SetToFalseAndServerNeedsAuth_StatusCodeU [Theory, MemberData(nameof(RedirectStatusCodes))] public async Task DefaultHeaders_SetCredentials_ClearedOnRedirect(int statusCode) { + if (statusCode == 308 && (PlatformDetection.IsFullFramework || IsWinHttpHandler && PlatformDetection.WindowsVersion < 10)) + { + // 308 redirects are not supported on old versions of WinHttp, or on .NET Framework. + return; + } + HttpClientHandler handler = CreateHttpClientHandler(); using (var client = new HttpClient(handler)) { @@ -721,6 +732,12 @@ await LoopbackServer.CreateServerAsync(async (server, url) => [Theory, MemberData(nameof(RedirectStatusCodes))] public async Task GetAsync_AllowAutoRedirectFalse_RedirectFromHttpToHttp_StatusCodeRedirect(int statusCode) { + if (statusCode == 308 && (PlatformDetection.IsFullFramework || IsWinHttpHandler && PlatformDetection.WindowsVersion < 10)) + { + // 308 redirects are not supported on old versions of WinHttp, or on .NET Framework. + return; + } + HttpClientHandler handler = CreateHttpClientHandler(); handler.AllowAutoRedirect = false; using (var client = new HttpClient(handler)) @@ -750,6 +767,12 @@ public async Task AllowAutoRedirect_True_ValidateNewMethodUsedOnRedirection( newMethod = "POST"; } + if (statusCode == 308 && (PlatformDetection.IsFullFramework || IsWinHttpHandler && PlatformDetection.WindowsVersion < 10)) + { + // 308 redirects are not supported on old versions of WinHttp, or on .NET Framework. + return; + } + HttpClientHandler handler = CreateHttpClientHandler(); using (var client = new HttpClient(handler)) { @@ -868,6 +891,12 @@ await LoopbackServer.CreateServerAsync(async (redirServer, redirUrl) => [Theory, MemberData(nameof(RedirectStatusCodes))] public async Task GetAsync_AllowAutoRedirectTrue_RedirectFromHttpToHttp_StatusCodeOK(int statusCode) { + if (statusCode == 308 && (PlatformDetection.IsFullFramework || IsWinHttpHandler && PlatformDetection.WindowsVersion < 10)) + { + // 308 redirects are not supported on old versions of WinHttp, or on .NET Framework. + return; + } + HttpClientHandler handler = CreateHttpClientHandler(); handler.AllowAutoRedirect = true; using (var client = new HttpClient(handler)) @@ -1225,6 +1254,12 @@ public async Task HttpClientHandler_CredentialIsNotCredentialCacheAfterRedirect_ [Theory, MemberData(nameof(RedirectStatusCodes))] public async Task GetAsync_CredentialIsCredentialCacheUriRedirect_StatusCodeOK(int statusCode) { + if (statusCode == 308 && (PlatformDetection.IsFullFramework || IsWinHttpHandler && PlatformDetection.WindowsVersion < 10)) + { + // 308 redirects are not supported on old versions of WinHttp, or on .NET Framework. + return; + } + Uri uri = Configuration.Http.BasicAuthUriForCreds(secure: false, userName: Username, password: Password); Uri redirectUri = Configuration.Http.RedirectUriForCreds( secure: false, diff --git a/src/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs b/src/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs index da0bab6b1bc6..2f1f97c55be3 100644 --- a/src/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs +++ b/src/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs @@ -380,14 +380,15 @@ private static unsafe int ReceiveMessageFrom(SafeCloseSocket socket, SocketFlags receivedFlags = messageHeader.Flags; sockAddrLen = messageHeader.SocketAddressLen; - ipPacketInformation = GetIPPacketInformation(&messageHeader, isIPv4, isIPv6); } if (errno != Interop.Error.SUCCESS) { + ipPacketInformation = default(IPPacketInformation); return -1; } + ipPacketInformation = GetIPPacketInformation(&messageHeader, isIPv4, isIPv6); socketAddressLen = sockAddrLen; return checked((int)received); } @@ -442,15 +443,16 @@ private static unsafe int ReceiveMessageFrom( receivedFlags = messageHeader.Flags; int sockAddrLen = messageHeader.SocketAddressLen; - ipPacketInformation = GetIPPacketInformation(&messageHeader, isIPv4, isIPv6); if (errno == Interop.Error.SUCCESS) { + ipPacketInformation = GetIPPacketInformation(&messageHeader, isIPv4, isIPv6); socketAddressLen = sockAddrLen; return checked((int)received); } else { + ipPacketInformation = default(IPPacketInformation); return -1; } } diff --git a/src/System.Runtime.Extensions/tests/System/IO/Path.GetRelativePath.cs b/src/System.Runtime.Extensions/tests/System/IO/Path.GetRelativePath.cs index 36a03d6bfc9f..3f48bfd9ccb5 100644 --- a/src/System.Runtime.Extensions/tests/System/IO/Path.GetRelativePath.cs +++ b/src/System.Runtime.Extensions/tests/System/IO/Path.GetRelativePath.cs @@ -17,12 +17,26 @@ public static class GetRelativePathTests [InlineData(@"C:\", @"C:\b", @"b")] [InlineData(@"C:\a", @"C:\b", @"..\b")] [InlineData(@"C:\a", @"C:\b\", @"..\b\")] + [InlineData(@"C:\a\b", @"C:\a", @"..")] + [InlineData(@"C:\a\b", @"C:\a\", @"..")] + [InlineData(@"C:\a\b\", @"C:\a", @"..")] + [InlineData(@"C:\a\b\", @"C:\a\", @"..")] + [InlineData(@"C:\a\b\c", @"C:\a\b", @"..")] + [InlineData(@"C:\a\b\c", @"C:\a\b\", @"..")] + [InlineData(@"C:\a\b\c", @"C:\a", @"..\..")] + [InlineData(@"C:\a\b\c", @"C:\a\", @"..\..")] + [InlineData(@"C:\a\b\c\", @"C:\a\b", @"..")] + [InlineData(@"C:\a\b\c\", @"C:\a\b\", @"..")] + [InlineData(@"C:\a\b\c\", @"C:\a", @"..\..")] + [InlineData(@"C:\a\b\c\", @"C:\a\", @"..\..")] [InlineData(@"C:\a\", @"C:\b", @"..\b")] [InlineData(@"C:\a", @"C:\a\b", @"b")] [InlineData(@"C:\a", @"C:\A\b", @"b")] [InlineData(@"C:\a", @"C:\b\c", @"..\b\c")] [InlineData(@"C:\a\", @"C:\a\b", @"b")] + [InlineData(@"C:\", @"D:\", @"D:\")] [InlineData(@"C:\", @"D:\b", @"D:\b")] + [InlineData(@"C:\", @"D:\b\", @"D:\b\")] [InlineData(@"C:\a", @"D:\b", @"D:\b")] [InlineData(@"C:\a\", @"D:\b", @"D:\b")] [InlineData(@"C:\ab", @"C:\a", @"..\a")] diff --git a/src/System.Security.Principal.Windows/tests/WindowsIdentityTests.cs b/src/System.Security.Principal.Windows/tests/WindowsIdentityTests.cs index f107533511c8..4d696137eb7f 100644 --- a/src/System.Security.Principal.Windows/tests/WindowsIdentityTests.cs +++ b/src/System.Security.Principal.Windows/tests/WindowsIdentityTests.cs @@ -129,12 +129,16 @@ public static void RunImpersonatedTest_InvalidHandle() { using (var mutex = new Mutex()) { - Assert.Throws(() => + SafeAccessTokenHandle handle = null; + try { - WindowsIdentity.RunImpersonated( - new SafeAccessTokenHandle(mutex.SafeWaitHandle.DangerousGetHandle()), - () => { }); - }); + handle = new SafeAccessTokenHandle(mutex.SafeWaitHandle.DangerousGetHandle()); + Assert.Throws(() => WindowsIdentity.RunImpersonated(handle, () => { })); + } + finally + { + handle?.SetHandleAsInvalid(); + } } } diff --git a/tools-local/ILAsmVersion.txt b/tools-local/ILAsmVersion.txt index ec43494dd155..09640f58db66 100644 --- a/tools-local/ILAsmVersion.txt +++ b/tools-local/ILAsmVersion.txt @@ -1 +1 @@ -2.1.1-servicing-26606-02 \ No newline at end of file +2.1.3-servicing-26708-02 \ No newline at end of file