9103f7f
729738 - net-snmp dumps core in netsnmp_oid_find_prefix
9103f7f
1038011 - net-snmp: snmpd crashes/hangs when AgentX subagent times-out
9103f7f
9103f7f
commit f9304c83f76202db0e684269ca1af32e43cd9db4
9103f7f
Author: Jan Safranek <jsafranek@users.sourceforge.net>
9103f7f
Date:   Tue Feb 7 14:53:44 2012 +0100
9103f7f
9103f7f
    CHANGES: PATCH 1633670: fixed snmpd crashing when an AgentX subagent disconnect in the middle of processing of a request.
9103f7f
    
9103f7f
    I fixed also the memory leak reported in the tracker comments.
9103f7f
9103f7f
diff --git a/agent/mibgroup/agentx/master.c b/agent/mibgroup/agentx/master.c
9103f7f
index c42a42a..baeebaf 100644
9103f7f
--- a/agent/mibgroup/agentx/master.c
9103f7f
+++ b/agent/mibgroup/agentx/master.c
9103f7f
@@ -219,6 +219,9 @@ agentx_got_response(int operation,
9103f7f
     if (!cache) {
9103f7f
         DEBUGMSGTL(("agentx/master", "response too late on session %8p\n",
9103f7f
                     session));
9103f7f
+        /* response is too late, free the cache */
9103f7f
+        if (magic)
9103f7f
+            netsnmp_free_delegated_cache((netsnmp_delegated_cache*) magic);
9103f7f
         return 0;
9103f7f
     }
9103f7f
     requests = cache->requests;
9103f7f
@@ -606,6 +609,8 @@ agentx_master_handler(netsnmp_mib_handler *handler,
9103f7f
     result = snmp_async_send(ax_session, pdu, agentx_got_response, cb_data);
9103f7f
     if (result == 0) {
9103f7f
         snmp_free_pdu(pdu);
9103f7f
+        if (cb_data)
9103f7f
+            netsnmp_free_delegated_cache((netsnmp_delegated_cache*) cb_data);
9103f7f
     }
9103f7f
 
9103f7f
     return SNMP_ERR_NOERROR;
9103f7f
diff --git a/agent/mibgroup/agentx/master_admin.c b/agent/mibgroup/agentx/master_admin.c
9103f7f
index f16f392..b84b85e 100644
9103f7f
--- a/agent/mibgroup/agentx/master_admin.c
9103f7f
+++ b/agent/mibgroup/agentx/master_admin.c
9103f7f
@@ -133,11 +133,16 @@ close_agentx_session(netsnmp_session * session, int sessid)
9103f7f
          * requests, so that the delegated request will be completed and
9103f7f
          * further requests can be processed
9103f7f
          */
9103f7f
-        netsnmp_remove_delegated_requests_for_session(session);
9103f7f
+	while (netsnmp_remove_delegated_requests_for_session(session)) {
9103f7f
+		DEBUGMSGTL(("agentx/master", "Continue removing delegated reqests\n"));
9103f7f
+	}
9103f7f
+
9103f7f
         if (session->subsession != NULL) {
9103f7f
             netsnmp_session *subsession = session->subsession;
9103f7f
             for(; subsession; subsession = subsession->next) {
9103f7f
-                netsnmp_remove_delegated_requests_for_session(subsession);
9103f7f
+                while (netsnmp_remove_delegated_requests_for_session(subsession)) {
9103f7f
+			DEBUGMSGTL(("agentx/master", "Continue removing delegated subsession reqests\n"));
9103f7f
+		}
9103f7f
             }
9103f7f
         }
9103f7f