diff -urNp a/agent/snmp_agent.c b/agent/snmp_agent.c --- a/agent/snmp_agent.c 2020-04-23 08:22:11.654986675 +0200 +++ b/agent/snmp_agent.c 2020-04-23 08:24:04.245200730 +0200 @@ -1429,12 +1429,6 @@ free_agent_snmp_session(netsnmp_agent_se DEBUGMSGTL(("verbose:asp", "asp %p reqinfo %p freed\n", asp, asp->reqinfo)); - /* Clean up securityStateRef here to prevent a double free */ - if (asp->orig_pdu && asp->orig_pdu->securityStateRef) - snmp_free_securityStateRef(asp->orig_pdu); - if (asp->pdu && asp->pdu->securityStateRef) - snmp_free_securityStateRef(asp->pdu); - if (asp->orig_pdu) snmp_free_pdu(asp->orig_pdu); if (asp->pdu) diff -urNp a/include/net-snmp/pdu_api.h b/include/net-snmp/pdu_api.h --- a/include/net-snmp/pdu_api.h 2020-04-23 08:22:11.704987213 +0200 +++ b/include/net-snmp/pdu_api.h 2020-04-23 08:24:18.876358902 +0200 @@ -19,8 +19,6 @@ NETSNMP_IMPORT netsnmp_pdu *snmp_fix_pdu( netsnmp_pdu *pdu, int idx); NETSNMP_IMPORT void snmp_free_pdu( netsnmp_pdu *pdu); -NETSNMP_IMPORT -void snmp_free_securityStateRef( netsnmp_pdu *pdu); #ifdef __cplusplus } diff -urNp a/snmplib/snmp_api.c b/snmplib/snmp_api.c --- a/snmplib/snmp_api.c 2020-04-23 08:22:11.718987363 +0200 +++ b/snmplib/snmp_api.c 2020-04-23 08:31:12.410812524 +0200 @@ -3862,17 +3862,6 @@ free_securityStateRef(netsnmp_pdu* pdu) pdu->securityStateRef = NULL; } -/* - * This function is here to provide a separate call to - * free the securityStateRef memory. This is needed to prevent - * a double free if this memory is freed in snmp_free_pdu. - */ -void -snmp_free_securityStateRef(netsnmp_pdu* pdu) -{ - free_securityStateRef(pdu); -} - #define ERROR_STAT_LENGTH 11 int @@ -5137,6 +5126,8 @@ snmp_free_pdu(netsnmp_pdu *pdu) if (!pdu) return; + free_securityStateRef(pdu); + /* * If the command field is empty, that probably indicates * that this PDU structure has already been freed. @@ -5278,12 +5269,6 @@ _sess_process_packet(void *sessp, netsnm } if (ret != SNMP_ERR_NOERROR) { - /* - * Call the security model to free any securityStateRef supplied w/ msg. - */ - if (pdu->securityStateRef != NULL) { - free_securityStateRef(pdu); - } snmp_free_pdu(pdu); return -1; } @@ -5441,14 +5426,6 @@ _sess_process_packet(void *sessp, netsnm } } - /* - * Call USM to free any securityStateRef supplied with the message. - */ - if (pdu != NULL && pdu->securityStateRef && - pdu->command == SNMP_MSG_TRAP2) { - free_securityStateRef(pdu); - } - if (!handled) { snmp_increment_statistic(STAT_SNMPUNKNOWNPDUHANDLERS); DEBUGMSGTL(("sess_process_packet", "unhandled PDU\n"));