From 58cd5bcb56d8908d94cf05aa6c2802ce9e6aa9a5 Mon Sep 17 00:00:00 2001 From: hansr Date: Thu, 18 Dec 2025 11:34:22 -0800 Subject: [PATCH 1/2] don't proxy malformed requests and catch nil errors before exception handler to reduce direct malformed requests showing in logs as error --- lib/network/rpc.ex | 49 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/lib/network/rpc.ex b/lib/network/rpc.ex index 838b949..d2aa22f 100644 --- a/lib/network/rpc.ex +++ b/lib/network/rpc.ex @@ -260,13 +260,21 @@ defmodule Network.Rpc do end "dio_traffic" -> - chain_id = Base16.decode_int(hd(params)) + chain_id_param = + case params do + [] -> throw(:badrequest) + [nil | _] -> throw(:badrequest) + [param | _] -> param + end + + chain_id = Base16.decode_int(chain_id_param) peak = RemoteChain.peaknumber(chain_id) peak_epoch = RemoteChain.epoch(chain_id, peak) epoch = case params do - [_chain_id, epoch] -> Base16.decode_int(epoch) + [_chain_id, epoch] when epoch != nil -> Base16.decode_int(epoch) + [_chain_id, _epoch] -> peak_epoch [_chain_id] -> peak_epoch end @@ -302,7 +310,14 @@ defmodule Network.Rpc do }) "dio_tickets" -> - chain_id = Base16.decode_int(hd(params)) + chain_id_param = + case params do + [] -> throw(:badrequest) + [nil | _] -> throw(:badrequest) + [param | _] -> param + end + + chain_id = Base16.decode_int(chain_id_param) peak = RemoteChain.peaknumber(chain_id) peak_epoch = RemoteChain.epoch(chain_id, peak) @@ -310,6 +325,7 @@ defmodule Network.Rpc do case params do [_chain_id, epoch] when is_integer(epoch) -> epoch [_chain_id, epoch] when is_binary(epoch) -> Base16.decode_int(epoch) + [_chain_id, epoch] when epoch == nil -> peak_epoch [_chain_id] -> peak_epoch end @@ -427,9 +443,30 @@ defmodule Network.Rpc do end defp handle_proxy(method, params, opts) do - [node | params] = params - node = Base16.decode(node) - server = KademliaLight.find_node_object(node) + case params do + [] -> result(nil, 400) + [nil | _] -> result(nil, 400) + [node | params] -> + # Validate that params don't contain nil values for methods that require them + invalid_params = + method in ["dio_traffic", "dio_tickets"] and + params != [] and + case params do + [nil | _] -> true + _ -> false + end + + if invalid_params do + result(nil, 400) + else + node = Base16.decode(node) + server = KademliaLight.find_node_object(node) + handle_proxy_continue(method, params, opts, node, server) + end + end + end + + defp handle_proxy_continue(method, params, opts, node, server) do cond do method not in [ From 3b8b3c794f0ad7fb895e7f7f18ce943b8c145aab Mon Sep 17 00:00:00 2001 From: Dominic Letz Date: Mon, 19 Jan 2026 09:38:47 +0100 Subject: [PATCH 2/2] mix format --- lib/network/rpc.ex | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/network/rpc.ex b/lib/network/rpc.ex index d2aa22f..61ab12f 100644 --- a/lib/network/rpc.ex +++ b/lib/network/rpc.ex @@ -444,17 +444,21 @@ defmodule Network.Rpc do defp handle_proxy(method, params, opts) do case params do - [] -> result(nil, 400) - [nil | _] -> result(nil, 400) + [] -> + result(nil, 400) + + [nil | _] -> + result(nil, 400) + [node | params] -> # Validate that params don't contain nil values for methods that require them invalid_params = method in ["dio_traffic", "dio_tickets"] and - params != [] and - case params do - [nil | _] -> true - _ -> false - end + params != [] and + case params do + [nil | _] -> true + _ -> false + end if invalid_params do result(nil, 400) @@ -467,7 +471,6 @@ defmodule Network.Rpc do end defp handle_proxy_continue(method, params, opts, node, server) do - cond do method not in [ "dio_checkConnectivity",