From 9350316e6df901fd4cd57949854e61792f41f84f Mon Sep 17 00:00:00 2001 From: gregsinclair42 Date: Wed, 26 Feb 2025 13:07:39 -0700 Subject: [PATCH 1/4] Check for a valid ILambdaContext in the args before attempting to use it. Do this to avoid null reference exceptions. --- .../Internal/LoggingLambdaContext.cs | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/libraries/src/AWS.Lambda.Powertools.Logging/Internal/LoggingLambdaContext.cs b/libraries/src/AWS.Lambda.Powertools.Logging/Internal/LoggingLambdaContext.cs index a8846b155..17c5a3a8c 100644 --- a/libraries/src/AWS.Lambda.Powertools.Logging/Internal/LoggingLambdaContext.cs +++ b/libraries/src/AWS.Lambda.Powertools.Logging/Internal/LoggingLambdaContext.cs @@ -74,24 +74,21 @@ public static bool Extract(AspectEventArgs args) return false; var index = Array.FindIndex(args.Method.GetParameters(), p => p.ParameterType == typeof(ILambdaContext)); - if (index >= 0) - { - var x = (ILambdaContext)args.Args[index]; - - Instance = new LoggingLambdaContext - { - AwsRequestId = x.AwsRequestId, - FunctionName = x.FunctionName, - FunctionVersion = x.FunctionVersion, - InvokedFunctionArn = x.InvokedFunctionArn, - LogGroupName = x.LogGroupName, - LogStreamName = x.LogStreamName, - MemoryLimitInMB = x.MemoryLimitInMB - }; - return true; - } + if (index < 0 || args.Args[index] == null || args.Args[index] is not ILambdaContext) return false; + + var x = (ILambdaContext)args.Args[index]; - return false; + Instance = new LoggingLambdaContext + { + AwsRequestId = x.AwsRequestId, + FunctionName = x.FunctionName, + FunctionVersion = x.FunctionVersion, + InvokedFunctionArn = x.InvokedFunctionArn, + LogGroupName = x.LogGroupName, + LogStreamName = x.LogStreamName, + MemoryLimitInMB = x.MemoryLimitInMB + }; + return true; } /// From 0e8d3484c64cee8c0af7f29c7b5ea469b711a1a2 Mon Sep 17 00:00:00 2001 From: gregsinclair42 Date: Wed, 26 Feb 2025 13:46:59 -0700 Subject: [PATCH 2/4] Add a unit test to prove the fix works --- .../Context/LambdaContextTest.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs b/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs index feb9283e9..cbd3c6618 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs @@ -56,6 +56,33 @@ public void Extract_WhenHasLambdaContextArgument_InitializesLambdaContextInfo() Assert.Null(LoggingLambdaContext.Instance); } + [Fact] + public void Extract_Extract_When_LambdaContext_Is_Null_But_Not_FIrst_Parameter_Returns_False() + { + // Arrange + ILambdaContext lambdaContext = null; + var args = Substitute.For(); + var method = Substitute.For(); + var parameter1 = Substitute.For(); + var parameter2 = Substitute.For(); + + // Setup parameters + parameter1.ParameterType.Returns(typeof(string)); + parameter2.ParameterType.Returns(typeof(ILambdaContext)); + + // Setup method + method.GetParameters().Returns(new[] { parameter1, parameter2 }); + + // Setup args + args.Method = method; + args.Args = new object[] { "requestContext", lambdaContext }; + + // Act && Assert + LoggingLambdaContext.Clear(); + Assert.Null(LoggingLambdaContext.Instance); + Assert.False(LoggingLambdaContext.Extract(args)); + } + [Fact] public void Extract_When_Args_Null_Returns_False() { From eed7b265d93c814262235d719257fe7d38da0754 Mon Sep 17 00:00:00 2001 From: gregsinclair42 Date: Wed, 26 Feb 2025 13:48:30 -0700 Subject: [PATCH 3/4] Fix typo --- .../Context/LambdaContextTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs b/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs index cbd3c6618..fc8c62d99 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs @@ -57,7 +57,7 @@ public void Extract_WhenHasLambdaContextArgument_InitializesLambdaContextInfo() } [Fact] - public void Extract_Extract_When_LambdaContext_Is_Null_But_Not_FIrst_Parameter_Returns_False() + public void Extract_Extract_When_LambdaContext_Is_Null_But_Not_First_Parameter_Returns_False() { // Arrange ILambdaContext lambdaContext = null; From 63ea4fec16d9795cce073877b28cd97ecda55d91 Mon Sep 17 00:00:00 2001 From: gregsinclair42 Date: Thu, 27 Feb 2025 09:00:45 -0700 Subject: [PATCH 4/4] Fix typo --- .../Context/LambdaContextTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs b/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs index fc8c62d99..31e980ba8 100644 --- a/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs +++ b/libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Context/LambdaContextTest.cs @@ -57,7 +57,7 @@ public void Extract_WhenHasLambdaContextArgument_InitializesLambdaContextInfo() } [Fact] - public void Extract_Extract_When_LambdaContext_Is_Null_But_Not_First_Parameter_Returns_False() + public void Extract_When_LambdaContext_Is_Null_But_Not_First_Parameter_Returns_False() { // Arrange ILambdaContext lambdaContext = null;