From 2ca0b935aba3933bf0f22c30dbd3f86c34057a8d Mon Sep 17 00:00:00 2001 From: Eugene Shcherbo Date: Wed, 14 Oct 2020 18:26:04 +0300 Subject: [PATCH] Validate input string passed to LogValuesFormatter (#43238) Add validation of a format string passed to LogValuesFormatter to throw `ArgumentNullException` if the string is `null` so that all the methods of the `LogMessage.Define` group depending on that class doesn't throw `NullReferenceException` when configuring a logger. Fix #36565 --- .../src/LogValuesFormatter.cs | 5 +++++ .../tests/Common/LoggerMessageTest.cs | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/libraries/Microsoft.Extensions.Logging.Abstractions/src/LogValuesFormatter.cs b/src/libraries/Microsoft.Extensions.Logging.Abstractions/src/LogValuesFormatter.cs index 598554d..c632219 100644 --- a/src/libraries/Microsoft.Extensions.Logging.Abstractions/src/LogValuesFormatter.cs +++ b/src/libraries/Microsoft.Extensions.Logging.Abstractions/src/LogValuesFormatter.cs @@ -22,6 +22,11 @@ namespace Microsoft.Extensions.Logging public LogValuesFormatter(string format) { + if (format == null) + { + throw new ArgumentNullException(nameof(format)); + } + OriginalFormat = format; var sb = new StringBuilder(); diff --git a/src/libraries/Microsoft.Extensions.Logging/tests/Common/LoggerMessageTest.cs b/src/libraries/Microsoft.Extensions.Logging/tests/Common/LoggerMessageTest.cs index 41a351b..68a42a9 100644 --- a/src/libraries/Microsoft.Extensions.Logging/tests/Common/LoggerMessageTest.cs +++ b/src/libraries/Microsoft.Extensions.Logging/tests/Common/LoggerMessageTest.cs @@ -322,6 +322,26 @@ namespace Microsoft.Extensions.Logging.Test Assert.Equal(expectedMessage, exception.Message); } + [Theory] + [MemberData(nameof(DefineMethodsData))] + public void DefineMessage_ThrowsException_WhenFormatString_IsNull(Func define) + { + // Act + var exception = Assert.Throws( + () => define.Invoke(LogLevel.Error, 0, null)); + } + + public static IEnumerable DefineMethodsData => new[] + { + new object[] { (Func)LoggerMessage.Define }, + new object[] { (Func)LoggerMessage.Define }, + new object[] { (Func)LoggerMessage.Define }, + new object[] { (Func)LoggerMessage.Define }, + new object[] { (Func)LoggerMessage.Define }, + new object[] { (Func)LoggerMessage.Define }, + new object[] { (Func)LoggerMessage.Define } + }; + public static IEnumerable LogMessagesData => new[] { new object[] { LoggerMessage.Define(LogLevel.Error, 0, "Log "), 0 }, -- 2.7.4