diff -I '\$Id: ' -u -r -b -w -p -d --new-file --exclude-from=/Users/rstory/.rcfiles/diff-ignore SVN/include/net-snmp/agent/table.h APPLE/include/net-snmp/agent/table.h
--- SVN/include/net-snmp/agent/table.h
+++ APPLE/include/net-snmp/agent/table.h
@@ -147,6 +147,8 @@ extern "C" {
netsnmp_table_registration_info
*netsnmp_find_table_registration_info(netsnmp_handler_registration
*reginfo);
+ void netsnmp_table_registration_info_free(netsnmp_table_registration_info *);
+
netsnmp_index * netsnmp_table_index_find_next_row(netsnmp_container *c,
netsnmp_table_request_info *tblreq);
diff -I '\$Id: ' -u -r -b -w -p -d --new-file --exclude-from=/Users/rstory/.rcfiles/diff-ignore SVN/agent/helpers/table.c APPLE/agent/helpers/table.c
--- SVN/agent/helpers/table.c
+++ APPLE/agent/helpers/table.c
@@ -108,7 +108,10 @@ int
netsnmp_register_table(netsnmp_handler_registration *reginfo,
netsnmp_table_registration_info *tabreq)
{
- netsnmp_inject_handler(reginfo, netsnmp_get_table_handler(tabreq));
+ int rc = netsnmp_inject_handler(reginfo, netsnmp_get_table_handler(tabreq));
+ if (SNMPERR_SUCCESS != rc)
+ return rc;
+
return netsnmp_register_handler(reginfo);
}
@@ -733,10 +736,35 @@ int
netsnmp_sparse_table_register(netsnmp_handler_registration *reginfo,
netsnmp_table_registration_info *tabreq)
{
- netsnmp_inject_handler(reginfo,
- netsnmp_create_handler(SPARSE_TABLE_HANDLER_NAME,
- sparse_table_helper_handler));
- netsnmp_inject_handler(reginfo, netsnmp_get_table_handler(tabreq));
+ netsnmp_mib_handler *handler1, *handler2;
+ int rc;
+
+ handler1 = netsnmp_create_handler(SPARSE_TABLE_HANDLER_NAME,
+ sparse_table_helper_handler);
+ if (NULL == handler1)
+ return SNMP_ERR_GENERR;
+
+ handler2 = netsnmp_get_table_handler(tabreq);
+ if (NULL == handler2 ) {
+ netsnmp_handler_free(handler1);
+ return SNMP_ERR_GENERR;
+ }
+
+ rc = netsnmp_inject_handler(reginfo, handler1);
+ if (SNMPERR_SUCCESS != rc) {
+ netsnmp_handler_free(handler1);
+ netsnmp_handler_free(handler2);
+ return rc;
+ }
+
+ rc = netsnmp_inject_handler(reginfo, handler2);
+ if (SNMPERR_SUCCESS != rc) {
+ /** handler1 is in reginfo... remove and free?? */
+ netsnmp_handler_free(handler2);
+ return rc;
+ }
+
+ /** both handlers now in reginfo, so nothing to do on error */
return netsnmp_register_handler(reginfo);
}
@@ -932,6 +960,26 @@ netsnmp_check_getnext_reply(netsnmp_requ
return 0;
}
+void
+netsnmp_table_registration_info_free(netsnmp_table_registration_info *tri)
+{
+ if (NULL == tri)
+ return;
+
+ if (NULL != tri->indexes)
+ snmp_free_varbind(tri->indexes);
+
+#if 0
+ /*
+ * sigh... example use of valid_columns points to static memory,
+ * so freeing it would be bad... we'll just have to live with any
+ * leaks, for now...
+ */
+#endif
+
+ free(tri);
+}
+
/** @} */
/*