From 8eb93cf525713b10e90d073c84203b90f4d29f99 Mon Sep 17 00:00:00 2001 From: yperbasis Date: Sat, 11 Apr 2026 10:24:42 +0200 Subject: [PATCH 1/2] fix nil pointer panic in check_consensus_sync_status When GetNodeSyncStatus returns an error, syncStatus is nil, but getClientInfo dereferences it unconditionally. This causes a panic when a consensus client is temporarily unreachable (e.g. during initial network bootstrap before genesis). The execution sync status task already handles this correctly with a nil guard; apply the same pattern here. Co-Authored-By: Claude Opus 4.6 (1M context) --- pkg/tasks/check_consensus_sync_status/task.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/pkg/tasks/check_consensus_sync_status/task.go b/pkg/tasks/check_consensus_sync_status/task.go index 0bde1b07..94ab2b8a 100644 --- a/pkg/tasks/check_consensus_sync_status/task.go +++ b/pkg/tasks/check_consensus_sync_status/task.go @@ -215,11 +215,14 @@ func (t *Task) processClientCheck(client *clients.PoolClient, syncStatus *rpc.Sy func (t *Task) getClientInfo(client *clients.PoolClient, syncStatus *rpc.SyncStatus) *ClientInfo { clientInfo := &ClientInfo{ - Name: client.Config.Name, - Synchronizing: syncStatus.IsSyncing, - Optimistic: syncStatus.IsOptimistic, - SyncHead: syncStatus.HeadSlot, - SyncDistance: syncStatus.SyncDistance, + Name: client.Config.Name, + } + + if syncStatus != nil { + clientInfo.Synchronizing = syncStatus.IsSyncing + clientInfo.Optimistic = syncStatus.IsOptimistic + clientInfo.SyncHead = syncStatus.HeadSlot + clientInfo.SyncDistance = syncStatus.SyncDistance } return clientInfo From f2c7f0c443a54c06bca5abd839e6e99f9b6f619c Mon Sep 17 00:00:00 2001 From: yperbasis Date: Sun, 12 Apr 2026 10:31:00 +0200 Subject: [PATCH 2/2] getClientInfo: early return with explicit fields on nil syncStatus Address review: use an early-return guard with Synchronizing: true (assume unhealthy) instead of relying on Go zero-value defaults. Co-Authored-By: Claude Opus 4.6 (1M context) --- pkg/tasks/check_consensus_sync_status/task.go | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/pkg/tasks/check_consensus_sync_status/task.go b/pkg/tasks/check_consensus_sync_status/task.go index 94ab2b8a..248ad82c 100644 --- a/pkg/tasks/check_consensus_sync_status/task.go +++ b/pkg/tasks/check_consensus_sync_status/task.go @@ -214,16 +214,21 @@ func (t *Task) processClientCheck(client *clients.PoolClient, syncStatus *rpc.Sy } func (t *Task) getClientInfo(client *clients.PoolClient, syncStatus *rpc.SyncStatus) *ClientInfo { - clientInfo := &ClientInfo{ - Name: client.Config.Name, + if syncStatus == nil { + // RPC failed — return skeletal info without dereferencing. + return &ClientInfo{ + Name: client.Config.Name, + Synchronizing: true, // assume unhealthy when status is unknown + SyncHead: 0, + SyncDistance: 0, + } } - if syncStatus != nil { - clientInfo.Synchronizing = syncStatus.IsSyncing - clientInfo.Optimistic = syncStatus.IsOptimistic - clientInfo.SyncHead = syncStatus.HeadSlot - clientInfo.SyncDistance = syncStatus.SyncDistance + return &ClientInfo{ + Name: client.Config.Name, + Synchronizing: syncStatus.IsSyncing, + Optimistic: syncStatus.IsOptimistic, + SyncHead: syncStatus.HeadSlot, + SyncDistance: syncStatus.SyncDistance, } - - return clientInfo }