From d830c062aea6389e02718592d623ef7f8fe81f4a Mon Sep 17 00:00:00 2001 From: catoc Date: Thu, 23 Apr 2026 11:37:20 +0800 Subject: [PATCH] fix(edge): prevent crash on supernode resolution failure at startup Add a retry loop in edge_init to handle failed supernode DNS resolution. Prevents NULL pointer dereference of eee->curr_sn when no supernodes are available at startup. --- src/edge_utils.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/edge_utils.c b/src/edge_utils.c index a67ced95..9ea388d3 100644 --- a/src/edge_utils.c +++ b/src/edge_utils.c @@ -667,13 +667,24 @@ struct n3n_runtime_data* edge_init (const n2n_edge_conf_t *conf, int *rv) { // Show the user what has been configured resolve_log_hostnames(RESOLVE_LIST_SUPERNODE); - if(resolve_hostnames_str_to_peer_info( - RESOLVE_LIST_SUPERNODE, - &eee->supernodes)) { - traceEvent( - TRACE_WARNING, - "resolve_hostnames_str_to_peer_info returned errors" - ); + // Loop until we successfully resolve at least one supernode + while(1) { + if(resolve_hostnames_str_to_peer_info( + RESOLVE_LIST_SUPERNODE, + &eee->supernodes)) { + traceEvent( + TRACE_WARNING, + "resolve_hostnames_str_to_peer_info returned errors" + ); + } + + // If we successfully got a supernode, break out of the loop + if(eee->supernodes) { + break; + } + + traceEvent(TRACE_WARNING, "No supernodes resolved, retrying in 5 seconds..."); + sleep(5); } // Statically calculate how many packet buffers we need: