From ea44dc5e6efab530756506e49fc3443bc567ca94 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Tue, 11 Oct 2016 16:37:44 -0700 Subject: [PATCH] Add blanket exception handling in DesktopStrongNameProvider (#14414) --- .../Attributes/EmitTestStrongNameProvider.cs | 80 +++++++++++++++++++ .../StrongName/DesktopStrongNameProvider.cs | 6 +- 2 files changed, 83 insertions(+), 3 deletions(-) diff --git a/src/Compilers/CSharp/Test/Emit/Attributes/EmitTestStrongNameProvider.cs b/src/Compilers/CSharp/Test/Emit/Attributes/EmitTestStrongNameProvider.cs index 64c2df914c6..71899994275 100644 --- a/src/Compilers/CSharp/Test/Emit/Attributes/EmitTestStrongNameProvider.cs +++ b/src/Compilers/CSharp/Test/Emit/Attributes/EmitTestStrongNameProvider.cs @@ -1,7 +1,9 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.CodeAnalysis.CSharp.Test.Utilities; +using Roslyn.Test.Utilities; using System; +using System.Collections.Immutable; using System.IO; using Xunit; @@ -41,6 +43,84 @@ internal override Stream CreateInputStream() _underlyingProvider.SignAssembly(keys, inputStream, outputStream); } + private class TestDesktopStrongNameProvider : DesktopStrongNameProvider + { + private readonly Func m_readAllBytes; + + internal delegate void ReadKeysFromContainerDelegate( + string keyContainer, + out ImmutableArray publicKey); + + private readonly ReadKeysFromContainerDelegate m_readKeysFromContainer; + + public TestDesktopStrongNameProvider( + Func readAllBytes = null, + ReadKeysFromContainerDelegate readKeysFromContainer = null) + { + m_readAllBytes = readAllBytes; + m_readKeysFromContainer = readKeysFromContainer; + } + + internal override byte[] ReadAllBytes(string fullPath) => + m_readAllBytes != null ? m_readAllBytes(fullPath) + : base.ReadAllBytes(fullPath); + + internal override void ReadKeysFromContainer(string keyContainer, out ImmutableArray publicKey) + { + if (m_readKeysFromContainer != null) + { + m_readKeysFromContainer(keyContainer, out publicKey); + } + else + { + base.ReadKeysFromContainer(keyContainer, out publicKey); + } + } + } + + [Fact] + [WorkItem(209695, "https://devdiv.visualstudio.com/DevDiv/_workitems?id=209694")] + public void ExceptionInReadAllBytes() + { + var ex = new Exception("Crazy exception you could never have predicted!"); + var provider = new TestDesktopStrongNameProvider((_) => + { + throw ex; + }); + + var src = @"class C {}"; + var keyFile = Temp.CreateFile().WriteAllBytes(TestResources.General.snKey).Path; + var options = TestOptions.DebugDll + .WithStrongNameProvider(provider) + .WithCryptoKeyFile(keyFile); + + var comp = CreateCompilationWithMscorlib(src, options: options); + comp.VerifyEmitDiagnostics( + // error CS7027: Error signing output with public key from file '{0}' -- '{1}' + Diagnostic(ErrorCode.ERR_PublicKeyFileFailure).WithArguments(keyFile, ex.Message).WithLocation(1, 1)); + } + + [Fact] + public void ExceptionInReadKeysFromContainer() + { + var ex = new Exception("Crazy exception you could never have predicted!"); + var provider = new TestDesktopStrongNameProvider(readKeysFromContainer: + (string _1, out ImmutableArray _2) => + { + throw ex; + }); + + var src = @"class C {}"; + var options = TestOptions.DebugDll + .WithStrongNameProvider(provider) + .WithCryptoKeyContainer("RoslynTestContainer"); + + var comp = CreateCompilationWithMscorlib(src, options: options); + comp.VerifyEmitDiagnostics( + // error CS7028: Error signing output with public key from container 'RoslynTestContainer' -- Crazy exception you could never have predicted! + Diagnostic(ErrorCode.ERR_PublicKeyContainerFailure).WithArguments("RoslynTestContainer", ex.Message).WithLocation(1, 1)); + } + [Fact] public void BadInputStream() { diff --git a/src/Compilers/Core/Portable/StrongName/DesktopStrongNameProvider.cs b/src/Compilers/Core/Portable/StrongName/DesktopStrongNameProvider.cs index b83f2f6b5b5..bd95d463656 100644 --- a/src/Compilers/Core/Portable/StrongName/DesktopStrongNameProvider.cs +++ b/src/Compilers/Core/Portable/StrongName/DesktopStrongNameProvider.cs @@ -213,7 +213,7 @@ internal override StrongNameKeys CreateKeys(string keyFilePath, string keyContai var fileContent = ImmutableArray.Create(ReadAllBytes(resolvedKeyFile)); return StrongNameKeys.CreateHelper(fileContent, keyFilePath); } - catch (IOException ex) + catch (Exception ex) { return new StrongNameKeys(StrongNameKeys.GetKeyFileError(messageProvider, keyFilePath, ex.Message)); } @@ -232,7 +232,7 @@ internal override StrongNameKeys CreateKeys(string keyFilePath, string keyContai return new StrongNameKeys(StrongNameKeys.GetContainerError(messageProvider, keyContainerName, new CodeAnalysisResourcesLocalizableErrorArgument(nameof(CodeAnalysisResources.AssemblySigningNotSupported)))); } - catch (IOException ex) + catch (Exception ex) { return new StrongNameKeys(StrongNameKeys.GetContainerError(messageProvider, keyContainerName, ex.Message)); } @@ -241,7 +241,7 @@ internal override StrongNameKeys CreateKeys(string keyFilePath, string keyContai return new StrongNameKeys(keyPair, publicKey, container, keyFilePath); } - private void ReadKeysFromContainer(string keyContainer, out ImmutableArray publicKey) + internal virtual void ReadKeysFromContainer(string keyContainer, out ImmutableArray publicKey) { try { -- GitLab