From f54fa152d9c26f77202409e1f3c6cd14f81f2e6b Mon Sep 17 00:00:00 2001 From: "lukasz.rozmej" Date: Mon, 11 Dec 2023 15:43:57 +0100 Subject: [PATCH 1/3] Fix json rpc missing parameter check --- src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs b/src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs index 2c34729f701..ce81309afea 100644 --- a/src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs +++ b/src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs @@ -99,7 +99,8 @@ private async Task ExecuteAsync(JsonRpcRequest request, string LogRequest(methodName, providedParameters, method.expectedParameters); - int missingParamsCount = method.expectedParameters.Length - providedParameters.GetArrayLength(); + var providerParameters = providedParameters.ValueKind == JsonValueKind.Array ? providedParameters.GetArrayLength() : 0; + int missingParamsCount = method.expectedParameters.Length - providerParameters; foreach (JsonElement item in providedParameters.EnumerateArray()) { if (item.ValueKind == JsonValueKind.Null || (item.ValueKind == JsonValueKind.String && item.ValueEquals(ReadOnlySpan.Empty))) From bab5710b83f384f1fba76e0bb31bdee77587df98 Mon Sep 17 00:00:00 2001 From: "lukasz.rozmej" Date: Mon, 11 Dec 2023 15:48:11 +0100 Subject: [PATCH 2/3] Add more check when enumerating --- src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs b/src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs index ce81309afea..4dab55e10db 100644 --- a/src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs +++ b/src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs @@ -99,13 +99,16 @@ private async Task ExecuteAsync(JsonRpcRequest request, string LogRequest(methodName, providedParameters, method.expectedParameters); - var providerParameters = providedParameters.ValueKind == JsonValueKind.Array ? providedParameters.GetArrayLength() : 0; - int missingParamsCount = method.expectedParameters.Length - providerParameters; - foreach (JsonElement item in providedParameters.EnumerateArray()) + var providedParametersLength = providedParameters.ValueKind == JsonValueKind.Array ? providedParameters.GetArrayLength() : 0; + int missingParamsCount = method.expectedParameters.Length - providedParametersLength; + if (providedParametersLength > 0) { - if (item.ValueKind == JsonValueKind.Null || (item.ValueKind == JsonValueKind.String && item.ValueEquals(ReadOnlySpan.Empty))) + foreach (JsonElement item in providedParameters.EnumerateArray()) { - missingParamsCount++; + if (item.ValueKind == JsonValueKind.Null || (item.ValueKind == JsonValueKind.String && item.ValueEquals(ReadOnlySpan.Empty))) + { + missingParamsCount++; + } } } From 999ea153e74b15b5561e9c88cd11a89b37cae752 Mon Sep 17 00:00:00 2001 From: "lukasz.rozmej" Date: Mon, 11 Dec 2023 16:04:29 +0100 Subject: [PATCH 3/3] Modify tests to serialize null on net_version --- src/Nethermind/Nethermind.JsonRpc.Test/JsonRpcServiceTests.cs | 4 ++-- src/Nethermind/Nethermind.JsonRpc.Test/RpcTest.cs | 4 ++-- src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Nethermind/Nethermind.JsonRpc.Test/JsonRpcServiceTests.cs b/src/Nethermind/Nethermind.JsonRpc.Test/JsonRpcServiceTests.cs index 91583f619e4..cb40d0e2626 100644 --- a/src/Nethermind/Nethermind.JsonRpc.Test/JsonRpcServiceTests.cs +++ b/src/Nethermind/Nethermind.JsonRpc.Test/JsonRpcServiceTests.cs @@ -48,7 +48,7 @@ public void Initialize() private ILogManager _logManager = null!; private JsonRpcContext _context = null!; - private JsonRpcResponse TestRequest(T module, string method, params string[] parameters) where T : IRpcModule + private JsonRpcResponse TestRequest(T module, string method, params string[]? parameters) where T : IRpcModule { RpcModuleProvider moduleProvider = new(new FileSystem(), _configurationProvider.GetConfig(), LimboLogs.Instance); moduleProvider.Register(new SingletonModulePool(new SingletonFactory(module), true)); @@ -182,7 +182,7 @@ public void NetVersionTest() { INetRpcModule netRpcModule = Substitute.For(); netRpcModule.net_version().ReturnsForAnyArgs(x => ResultWrapper.Success("1")); - JsonRpcSuccessResponse? response = TestRequest(netRpcModule, "net_version") as JsonRpcSuccessResponse; + JsonRpcSuccessResponse? response = TestRequest(netRpcModule, "net_version", null) as JsonRpcSuccessResponse; Assert.That(response?.Result, Is.EqualTo("1")); Assert.IsNotInstanceOf(response); } diff --git a/src/Nethermind/Nethermind.JsonRpc.Test/RpcTest.cs b/src/Nethermind/Nethermind.JsonRpc.Test/RpcTest.cs index 43a8d311af4..d66f7b41528 100644 --- a/src/Nethermind/Nethermind.JsonRpc.Test/RpcTest.cs +++ b/src/Nethermind/Nethermind.JsonRpc.Test/RpcTest.cs @@ -63,9 +63,9 @@ public static IJsonRpcService BuildRpcService(T module) where T : class, IRpc return service; } - public static JsonRpcRequest GetJsonRequest(string method, params string[] parameters) + public static JsonRpcRequest GetJsonRequest(string method, params string[]? parameters) { - var doc = JsonDocument.Parse(JsonSerializer.Serialize(parameters?.ToArray() ?? Array.Empty())); + var doc = JsonDocument.Parse(JsonSerializer.Serialize(parameters?.ToArray())); var request = new JsonRpcRequest() { JsonRpc = "2.0", diff --git a/src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs b/src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs index 4dab55e10db..bea90a5b9a4 100644 --- a/src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs +++ b/src/Nethermind/Nethermind.JsonRpc/JsonRpcService.cs @@ -236,7 +236,7 @@ private void LogRequest(string methodName, JsonElement providedParameters, Param int paramsCount = 0; const string separator = ", "; - if (providedParameters.ValueKind != JsonValueKind.Undefined && providedParameters.ValueKind != JsonValueKind.Null) + if (providedParameters.ValueKind == JsonValueKind.Array) { foreach (JsonElement param in providedParameters.EnumerateArray()) {