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