On Fri, Apr 15, 2011 at 5:41 PM, Daniel Ng <[email protected]> wrote:
> Can someone please suggest an alternate fix? Tested on v5.6 and v5.6.1.

Here's a patch for v5.6. It implements what I described in my original post
"Leaking memory and File Handles for every HUP". It stops the leaking of
file handles, but there is still a memory leak (about 500 bytes per HUP are
leaked). The memory leak was always present- it was uncovered by the patch,
not introduced by it.

The crash was worked around by commenting out a free() in snmp_transport.c.
Not ideal, but if you have any better suggestions I'd love to know!

A little feedback would be greatly appreciated!! It's been rather quiet
around here...


--- netsnmp/agent/mibgroup/target/snmpTargetAddrEntry.c 2010-06-13
07:33:30.000000000 +1000
+++ netsnmp/agent/mibgroup/target/snmpTargetAddrEntry.c 2011-04-20
10:30:41.000000000 +1000
@@ -22,6 +22,9 @@
#include "snmpTargetAddrEntry.h"
#include "util_funcs/header_generic.h"

+#include <net-snmp/agent/agent_callbacks.h>
+#include <net-snmp/library/snmp_transport.h>
+
#define snmpTargetAddrOIDLen 11 /*This is base+column,
                                 * i.e. everything but index */

@@ -336,10 +339,29 @@ init_snmpTargetAddrEntry(void)
    snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA,
                           store_snmpTargetAddrEntry, NULL);

+    snmp_register_callback(SNMP_CALLBACK_APPLICATION,
+                           SNMPD_CALLBACK_PRE_UPDATE_CONFIG,
+                           snmpTargetAddr_unregister_addr_entries, NULL);
}                               /* init_snmpTargetAddrEntry */


int
+snmpTargetAddr_unregister_addr_entries(int major, int minor,
+                                     void *serverarg, void *clientarg)
+{
+    DEBUGMSGTL(("snmpTargetAddrEntry",
+                    "snmpTargetAddr_unregister_addr_entries()\n"));
+
+    while (aAddrTable != NULL)
+    {
+        snmpTargetAddrTable_remFromList(aAddrTable, &aAddrTable);
+    }
+
+    return (0);
+}                               /* snmpTargetAddr_unregister_addr_entries
*/
+
+
+int
snmpTargetAddr_addName(struct targetAddrTable_struct *entry, char *cptr)
{
    size_t          len;

--- netsnmp/agent/mibgroup/target/snmpTargetAddrEntry.h 2008-05-21
09:00:28.000000000 +1000
+++ netsnmp/agent/mibgroup/target/snmpTargetAddrEntry.h 2011-04-14
11:58:15.000000000 +1000
@@ -70,6 +70,9 @@ config_add_mib(SNMPv2-TM)
      int             store_snmpTargetAddrEntry(int majorID, int minorID,
                                                void *serverarg,
                                                void *clientarg);
+     int            snmpTargetAddr_unregister_addr_entries(int major, int
minor,
+                                               void *serverarg, void
*clientarg);
+
      FindVarMethod   var_snmpTargetAddrEntry;

      struct targetAddrTable_struct *get_addrTable(void);


--- netsnmp/agent/mibgroup/target/snmpTargetParamsEntry.c       2010-03-26
22:58:03.000000000 +1100
+++ netsnmp/agent/mibgroup/target/snmpTargetParamsEntry.c       2011-04-19
17:18:24.000000000 +1000
@@ -19,6 +19,8 @@
 #include <net-snmp/net-snmp-includes.h>
 #include <net-snmp/agent/net-snmp-agent-includes.h>

+#include <net-snmp/agent/agent_callbacks.h>
+
 #include "snmpTargetParamsEntry.h"

 #define snmpTargetParamsOIDLen 11       /*This is base+column,
@@ -290,8 +292,26 @@ init_snmpTargetParamsEntry(void)
      */
     snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA,
                            store_snmpTargetParamsEntry, NULL);
+
+    snmp_register_callback(SNMP_CALLBACK_APPLICATION,
+                           SNMPD_CALLBACK_PRE_UPDATE_CONFIG,
+                           snmpTargetParams_unregister_params_entries,
NULL);
 }                               /*  init_snmpTargetParmsEntry  */

+int
+snmpTargetParams_unregister_params_entries(int major, int minor,
+                                     void *serverarg, void *clientarg)
+{
+    DEBUGMSGTL(("snmpTargetParams",
+                    "snmpTargetParams_unregister_params_entries()\n"));
+
+    while (aPTable != NULL)
+    {
+        snmpTargetParamTable_remFromList(aPTable, &aPTable);
+    }
+
+    return (0);
+}                               /*
snmpTargetParams_unregister_params_entries */

 int
 snmpTargetParams_addParamName(struct targetParamTable_struct *entry,

--- netsnmp/agent/mibgroup/target/snmpTargetParamsEntry.h       2008-05-21
08:40:56.000000000 +1000
+++ netsnmp/agent/mibgroup/target/snmpTargetParamsEntry.h       2011-04-19
17:21:56.000000000 +1000
@@ -60,6 +60,9 @@

      void            snmpd_parse_config_targetParams(const char *, char *);

+     int             snmpTargetParams_unregister_params_entries(int major,
int minor,
+                                               void *serverarg, void
*clientarg);
+
      WriteMethod     write_snmpTargetParamsMPModel;
      WriteMethod     write_snmpTargetParamsSecModel;
      WriteMethod     write_snmpTargetParamsSecName;

--- netsnmp/snmplib/snmp_transport.c    2010-08-02 21:02:52.000000000 +1000
+++ netsnmp/snmplib/snmp_transport.c    2011-04-20 10:24:16.000000000 +1000
@@ -196,9 +196,12 @@ netsnmp_transport_free(netsnmp_transport
     if (t->local != NULL) {
         SNMP_FREE(t->local);
     }
+//DNG HACK- Causes VACM read_config to crash snmpd, after HUP received:
+#if 0
     if (t->remote != NULL) {
         SNMP_FREE(t->remote);
     }
+#endif
     if (t->data != NULL) {
         SNMP_FREE(t->data);
     }
------------------------------------------------------------------------------
Benefiting from Server Virtualization: Beyond Initial Workload 
Consolidation -- Increasing the use of server virtualization is a top
priority.Virtualization can reduce costs, simplify management, and improve 
application availability and disaster protection. Learn more about boosting 
the value of server virtualization. http://p.sf.net/sfu/vmware-sfdev2dev
_______________________________________________
Net-snmp-coders mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders

Reply via email to