From 06c45cd404917df9caab734232d00161affdf1bd Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Tue, 10 Feb 2026 17:35:49 -0600 Subject: [PATCH] Fix SIGSEGV in forked SNMP child: remove double init_snmp() call In Fork mode the parent never calls snmp_init_library(), so pthread_once remains untriggered. The child called init_snmp() directly, then snmp_open_session() triggered pthread_once calling init_snmp() a second time. This double-initialization of libnetsnmp caused signal 11 in every child process. Let snmp_open_session() handle initialization via pthread_once, which correctly initializes exactly once and sets numeric OID format. --- native/snmp_helper.c | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/native/snmp_helper.c b/native/snmp_helper.c index 5a1f8be..21839e0 100644 --- a/native/snmp_helper.c +++ b/native/snmp_helper.c @@ -596,16 +596,12 @@ void snmp_get_isolated( child_reset_signals(); alarm(60); /* watchdog: kill child if stuck */ - /* Disable MIB loading to prevent crashes from missing/corrupt MIB files */ - setenv("MIBS", "", 1); /* Don't load any MIBs */ - setenv("MIBDIRS", "", 1); /* Don't search for MIB directories */ - netsnmp_set_mib_directory(""); /* Explicitly set empty MIB directory */ - - /* Initialize net-snmp fresh in child */ - init_snmp("towerops-child"); - netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, - NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, - NETSNMP_OID_OUTPUT_NUMERIC); + /* Disable MIB loading to prevent crashes from missing/corrupt MIB files. + * Set env vars BEFORE init_snmp() runs (via snmp_open_session below). + * Do NOT call init_snmp() directly here - snmp_open_session() calls + * snmp_init_library() which uses pthread_once to initialize exactly once. */ + setenv("MIBS", "", 1); + setenv("MIBDIRS", "", 1); snmp_isolated_get_result_t child_result; memset(&child_result, 0, sizeof(child_result)); @@ -730,16 +726,12 @@ void snmp_walk_isolated( child_reset_signals(); alarm(60); /* watchdog */ - /* Disable MIB loading to prevent crashes from missing/corrupt MIB files */ - setenv("MIBS", "", 1); /* Don't load any MIBs */ - setenv("MIBDIRS", "", 1); /* Don't search for MIB directories */ - netsnmp_set_mib_directory(""); /* Explicitly set empty MIB directory */ - - /* Initialize net-snmp fresh in child */ - init_snmp("towerops-child"); - netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, - NETSNMP_DS_LIB_OID_OUTPUT_FORMAT, - NETSNMP_OID_OUTPUT_NUMERIC); + /* Disable MIB loading to prevent crashes from missing/corrupt MIB files. + * Set env vars BEFORE init_snmp() runs (via snmp_open_session below). + * Do NOT call init_snmp() directly here - snmp_open_session() calls + * snmp_init_library() which uses pthread_once to initialize exactly once. */ + setenv("MIBS", "", 1); + setenv("MIBDIRS", "", 1); snmp_isolated_walk_header_t child_header; memset(&child_header, 0, sizeof(child_header));