Blame SOURCES/net-snmp-5.8-agent-of-death.patch

d3d151
diff -urNp a/agent/agent_trap.c b/agent/agent_trap.c
d3d151
--- a/agent/agent_trap.c	2019-02-13 13:10:36.862269252 +0100
d3d151
+++ b/agent/agent_trap.c	2019-02-13 15:02:11.396042356 +0100
d3d151
@@ -174,6 +174,11 @@ _trap_version_incr(int version)
d3d151
         case SNMP_VERSION_3:
d3d151
             ++_v2_sessions;
d3d151
             break;
d3d151
+#ifdef USING_AGENTX_PROTOCOL_MODULE
d3d151
+        case AGENTX_VERSION_1:
d3d151
+            /* agentx registers in sinks, no need to count */
d3d151
+            break;
d3d151
+#endif
d3d151
         default:
d3d151
             snmp_log(LOG_ERR, "unknown snmp version %d\n", version);
d3d151
     }
d3d151
@@ -201,6 +206,11 @@ _trap_version_decr(int version)
d3d151
                 _v2_sessions = 0;
d3d151
             }
d3d151
             break;
d3d151
+#ifdef USING_AGENTX_PROTOCOL_MODULE
d3d151
+        case AGENTX_VERSION_1:
d3d151
+            /* agentx registers in sinks, no need to count */
d3d151
+            break;
d3d151
+#endif
d3d151
         default:
d3d151
             snmp_log(LOG_ERR, "unknown snmp version %d\n", version);
d3d151
     }
d3d151
diff -urNp old/agent/mibgroup/agentx/master.c new/agent/mibgroup/agentx/master.c
d3d151
--- old/agent/mibgroup/agentx/master.c	2019-04-03 12:13:55.115769783 +0200
d3d151
+++ new/agent/mibgroup/agentx/master.c	2019-04-10 09:49:53.277168497 +0200
d3d151
@@ -280,6 +280,11 @@ agentx_got_response(int operation,
d3d151
         netsnmp_free_delegated_cache(cache);
d3d151
         return 0;
d3d151
 
d3d151
+    case NETSNMP_CALLBACK_OP_RESEND:
d3d151
+        DEBUGMSGTL(("agentx/master", "resend on session %8p req=0x%x\n",
d3d151
+                    session, (unsigned)reqid));
d3d151
+        return 0;
d3d151
+
d3d151
     case NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE:
d3d151
         /*
d3d151
          * This session is alive 
d3d151
diff -urNp old/snmplib/snmp_api.c new/snmplib/snmp_api.c
d3d151
--- old/snmplib/snmp_api.c	2019-04-24 00:28:34.904357292 +0200
d3d151
+++ new/snmplib/snmp_api.c	2019-04-24 00:24:40.101830685 +0200
d3d151
@@ -352,6 +352,7 @@ static int      snmpv3_build(u_char ** p
d3d151
                              netsnmp_pdu *pdu);
d3d151
 static int      snmp_parse_version(u_char *, size_t);
d3d151
 static int      snmp_resend_request(struct session_list *slp,
d3d151
+                                    netsnmp_request_list *orp,
d3d151
                                     netsnmp_request_list *rp,
d3d151
                                     int incr_retries);
d3d151
 static void     register_default_handlers(void);
d3d151
@@ -5717,7 +5718,7 @@ _sess_process_packet_handle_pdu(void *se
d3d151
 	     * * inifinite resend                      
d3d151
 	     */
d3d151
 	    if (rp->retries <= sp->retries) {
d3d151
-	      snmp_resend_request(slp, rp, TRUE);
d3d151
+	      snmp_resend_request(slp, orp, rp, TRUE);
d3d151
 	      break;
d3d151
 	    } else {
d3d151
 	      /* We're done with retries, so no longer waiting for a response */
d3d151
@@ -6662,9 +6663,22 @@ snmp_timeout(void)
d3d151
     snmp_res_unlock(MT_LIBRARY_ID, MT_LIB_SESSION);
d3d151
 }
d3d151
 
d3d151
+static void
d3d151
+remove_request(struct snmp_internal_session *isp,
d3d151
+               netsnmp_request_list *orp, netsnmp_request_list *rp)
d3d151
+{
d3d151
+    if (orp)
d3d151
+        orp->next_request = rp->next_request;
d3d151
+    else
d3d151
+        isp->requests = rp->next_request;
d3d151
+    if (isp->requestsEnd == rp)
d3d151
+        isp->requestsEnd = orp;
d3d151
+    snmp_free_pdu(rp->pdu);
d3d151
+}
d3d151
+
d3d151
 static int
d3d151
-snmp_resend_request(struct session_list *slp, netsnmp_request_list *rp,
d3d151
-                    int incr_retries)
d3d151
+snmp_resend_request(struct session_list *slp, netsnmp_request_list *orp,
d3d151
+                    netsnmp_request_list *rp, int incr_retries)
d3d151
 {
d3d151
     struct snmp_internal_session *isp;
d3d151
     netsnmp_session *sp;
d3d151
@@ -6731,9 +6745,11 @@ snmp_resend_request(struct session_list
d3d151
         sp->s_snmp_errno = SNMPERR_BAD_SENDTO;
d3d151
         sp->s_errno = errno;
d3d151
         snmp_set_detail(strerror(errno));
d3d151
-        if (rp->callback)
d3d151
+        if (rp->callback) {
d3d151
             rp->callback(NETSNMP_CALLBACK_OP_SEND_FAILED, sp,
d3d151
                          rp->pdu->reqid, rp->pdu, rp->cb_data);
d3d151
+            remove_request(isp, orp, rp);
d3d151
+        }
d3d151
         return -1;
d3d151
     } else {
d3d151
         netsnmp_get_monotonic_clock(&now;;
d3d151
@@ -6813,19 +6829,12 @@ snmp_sess_timeout(void *sessp)
d3d151
                     callback(NETSNMP_CALLBACK_OP_TIMED_OUT, sp,
d3d151
                              rp->pdu->reqid, rp->pdu, magic);
d3d151
                 }
d3d151
-                if (orp)
d3d151
-                    orp->next_request = rp->next_request;
d3d151
-                else
d3d151
-                    isp->requests = rp->next_request;
d3d151
-                if (isp->requestsEnd == rp)
d3d151
-                    isp->requestsEnd = orp;
d3d151
-                snmp_free_pdu(rp->pdu);
d3d151
+                remove_request(isp, orp, rp); 
d3d151
                 freeme = rp;
d3d151
                 continue;       /* don't update orp below */
d3d151
             } else {
d3d151
-                if (snmp_resend_request(slp, rp, TRUE)) {
d3d151
+                if (snmp_resend_request(slp, orp, rp, TRUE))
d3d151
                     break;
d3d151
-                }
d3d151
             }
d3d151
         }
d3d151
         orp = rp;