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.
This commit is contained in:
Graham McIntire 2026-02-10 17:35:49 -06:00
parent 0db587338e
commit 06c45cd404
No known key found for this signature in database

View file

@ -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));