Hi,
We are using net-snmp version 5.4.2.1.
We do see socket leakage in net-snmp when we add trap receiver to snmpd.conf
file and sending a SIGHUP signal to snmpd process to update configurations.
Continual update of snmpd.conf file followed by SIGHUP signal quickly makes the
file descriptor count to 1023 (default maximum count) and after that no traps
were sent to the destined host.
On analyzing the code, we see the following behavior.
For each trap receiver host configured (trapsink handle), snmpd creates a new
socket and in turn calls the notifyTable_register_notifications()function of
snmpNotifyTable.c passing the net-snmp session information.
In this register function, three structures are created and added to their
corresponding list
a. targetAddrTable_struct
b. targetParamTable_struct
c. snmpNotifyTable_data
The socket session earlier created was assigned to
ptr->sess = ss; // targetAddrTable_struct
When a SIGHUP signal is sent to the snmpd process, snmpd.c calls
notifyTable_unregister_notifications() function where only the list
(snmpNotifyTable_data) was cleaned leaving the other 2 tables undisturbed. This
causes the socket to remain open.
Again the update_config() function reads the configuration file and creates a
new structure and socket for each ‘trapsink’ handle it encounters.
Once it reaches the maximum count, snmpd does not able to create a socket for
trap notification and hence the trap is not sent.
Comment on top of unregister_notification function points not to do many SIGHUP
calls.
As the entries in the list is keep on added for new ‘trapsink’ handle, it also
reaches the MAX entries as mentioned below (though only few entries in the list
are active)
for (i = 0; i < MAX_ENTRIES; i++) {
sprintf(buf, "internal%d", i);
if (get_addrForName(buf) == NULL && get_paramEntry(buf) == NULL)
break;
}
if (i == MAX_ENTRIES) {
snmp_log(LOG_ERR,
"Can't register new trap destination: max limit reached: %d",
MAX_ENTRIES);
Can you please tell us why those structures (sockets) are not cleaned when
SIGHUP signal is called.
To overcome the above issues, we called functions to cleanup the residue 2
tables in unregister_notification function.
/* Free the target Address table and target Param table when
* snmpd re-reads the configuration.
*/
snmpTargetParamTable_dellist(); /* Param table clean */
snmpTargetAddrTable_dellist(); /* Address table clean */
Also found one invalid free in snmpTargetAddrTable_dispose() function in
snmpTargerAddrTable.c and we commented that.
SNMP_FREE(reaped->tAddress);
After making these changes, snmpd process runs without any problem (No Socket
leakages) even after the process is restated 2000 times (by issuing SIGHUP
signal).
Can you please tell us that the above code changes does not have any other side
effects?
Regards,
Surya.
------------------------------------------------------------------------------
_______________________________________________
Net-snmp-coders mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders