1diff -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 2--- SVN/include/net-snmp/agent/table.h 3+++ APPLE/include/net-snmp/agent/table.h 4@@ -147,6 +147,8 @@ extern "C" { 5 netsnmp_table_registration_info 6 *netsnmp_find_table_registration_info(netsnmp_handler_registration 7 *reginfo); 8+ void netsnmp_table_registration_info_free(netsnmp_table_registration_info *); 9+ 10 netsnmp_index * netsnmp_table_index_find_next_row(netsnmp_container *c, 11 netsnmp_table_request_info *tblreq); 12 13diff -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 14--- SVN/agent/helpers/table.c 15+++ APPLE/agent/helpers/table.c 16@@ -108,7 +108,10 @@ int 17 netsnmp_register_table(netsnmp_handler_registration *reginfo, 18 netsnmp_table_registration_info *tabreq) 19 { 20- netsnmp_inject_handler(reginfo, netsnmp_get_table_handler(tabreq)); 21+ int rc = netsnmp_inject_handler(reginfo, netsnmp_get_table_handler(tabreq)); 22+ if (SNMPERR_SUCCESS != rc) 23+ return rc; 24+ 25 return netsnmp_register_handler(reginfo); 26 } 27 28@@ -733,10 +736,35 @@ int 29 netsnmp_sparse_table_register(netsnmp_handler_registration *reginfo, 30 netsnmp_table_registration_info *tabreq) 31 { 32- netsnmp_inject_handler(reginfo, 33- netsnmp_create_handler(SPARSE_TABLE_HANDLER_NAME, 34- sparse_table_helper_handler)); 35- netsnmp_inject_handler(reginfo, netsnmp_get_table_handler(tabreq)); 36+ netsnmp_mib_handler *handler1, *handler2; 37+ int rc; 38+ 39+ handler1 = netsnmp_create_handler(SPARSE_TABLE_HANDLER_NAME, 40+ sparse_table_helper_handler); 41+ if (NULL == handler1) 42+ return SNMP_ERR_GENERR; 43+ 44+ handler2 = netsnmp_get_table_handler(tabreq); 45+ if (NULL == handler2 ) { 46+ netsnmp_handler_free(handler1); 47+ return SNMP_ERR_GENERR; 48+ } 49+ 50+ rc = netsnmp_inject_handler(reginfo, handler1); 51+ if (SNMPERR_SUCCESS != rc) { 52+ netsnmp_handler_free(handler1); 53+ netsnmp_handler_free(handler2); 54+ return rc; 55+ } 56+ 57+ rc = netsnmp_inject_handler(reginfo, handler2); 58+ if (SNMPERR_SUCCESS != rc) { 59+ /** handler1 is in reginfo... remove and free?? */ 60+ netsnmp_handler_free(handler2); 61+ return rc; 62+ } 63+ 64+ /** both handlers now in reginfo, so nothing to do on error */ 65 return netsnmp_register_handler(reginfo); 66 } 67 68@@ -932,6 +960,26 @@ netsnmp_check_getnext_reply(netsnmp_requ 69 return 0; 70 } 71 72+void 73+netsnmp_table_registration_info_free(netsnmp_table_registration_info *tri) 74+{ 75+ if (NULL == tri) 76+ return; 77+ 78+ if (NULL != tri->indexes) 79+ snmp_free_varbind(tri->indexes); 80+ 81+#if 0 82+ /* 83+ * sigh... example use of valid_columns points to static memory, 84+ * so freeing it would be bad... we'll just have to live with any 85+ * leaks, for now... 86+ */ 87+#endif 88+ 89+ free(tri); 90+} 91+ 92 /** @} */ 93 94 /* 95