Blame SOURCES/net-snmp-5.7.2-extend-reload.patch

9a6c41
1228893 - snmpd segfaults on reload with multiple 'exec' entry
9a6c41
9a6c41
commit 54290bede338164ca65a3eed224fa5040d7dd857
9a6c41
Author: Niels Baggesen <nba@users.sourceforge.net>
9a6c41
Date:   Fri Oct 26 07:50:11 2012 +0200
9a6c41
9a6c41
    Better cleanup of "exec" config to avoid crash during reload of config
9a6c41
9a6c41
diff --git a/agent/mibgroup/agent/extend.c b/agent/mibgroup/agent/extend.c
9a6c41
index 68a11e2..9cb641c 100644
9a6c41
--- a/agent/mibgroup/agent/extend.c
9a6c41
+++ b/agent/mibgroup/agent/extend.c
9a6c41
@@ -34,7 +34,7 @@ typedef struct extend_registration_block_s {
9a6c41
     size_t              oid_len;
9a6c41
     long                num_entries;
9a6c41
     netsnmp_extend     *ehead;
9a6c41
-    netsnmp_handler_registration       *reg[3];
9a6c41
+    netsnmp_handler_registration       *reg[4];
9a6c41
     struct extend_registration_block_s *next;
9a6c41
 } extend_registration_block;
9a6c41
 extend_registration_block *ereg_head = NULL;
9a6c41
@@ -222,10 +222,13 @@ _register_extend( oid *base, size_t len )
9a6c41
     rc = netsnmp_register_watched_scalar2( reg, winfo );
9a6c41
     if (rc != SNMPERR_SUCCESS)
9a6c41
         goto bail;
9a6c41
+    eptr->reg[3] = reg;
9a6c41
 
9a6c41
     return eptr;
9a6c41
 
9a6c41
 bail:
9a6c41
+    if (eptr->reg[3])
9a6c41
+        netsnmp_unregister_handler(eptr->reg[3]);
9a6c41
     if (eptr->reg[2])
9a6c41
         netsnmp_unregister_handler(eptr->reg[2]);
9a6c41
     if (eptr->reg[1])
9a6c41
@@ -267,6 +270,7 @@ extend_clear_callback(int majorID, int minorID,
9a6c41
         netsnmp_unregister_handler( eptr->reg[0] );
9a6c41
         netsnmp_unregister_handler( eptr->reg[1] );
9a6c41
         netsnmp_unregister_handler( eptr->reg[2] );
9a6c41
+        netsnmp_unregister_handler( eptr->reg[3] );
9a6c41
         SNMP_FREE(eptr);
9a6c41
     }
9a6c41
     ereg_head = NULL;
9a6c41
@@ -550,6 +554,10 @@ extend_parse_config(const char *token, char *cptr)
9a6c41
     }
9a6c41
 
9a6c41
     eptr      = _register_extend( oid_buf, oid_len );
9a6c41
+    if (!eptr) {
9a6c41
+        snmp_log(LOG_ERR, "Failed to register extend entry '%s' - possibly duplicate name.\n", exec_name );
9a6c41
+        return;
9a6c41
+    }
9a6c41
     extension = _new_extension( exec_name, flags, eptr );
9a6c41
     if (extension) {
9a6c41
         extension->command  = strdup( exec_command );