--- agent/helpers/table_iterator.c	2011-09-28 12:53:47.000000000 +0800
+++ agent/helpers/table_iterator.c-new	2012-09-19 16:57:18.198183000 +0800
@@ -631,12 +631,14 @@
 
             /* loop over each data point */
             while(index_search) {
+		int free_data_context = 1;
 
                 /* remember to free this later */
                 free_this_index_search = index_search;
             
                 /* compare against each request*/
                 for(request = requests ; request; request = request->next) {
+
                     if (request->processed)
                         continue;
 
@@ -683,12 +685,8 @@
                                         (free_this_index_search);
                                 return SNMP_ERR_GENERR;
                             }
+			    free_data_context = 0;
                             request_count--;   /* One less to look for */
-                        } else {
-                            if (iinfo->free_data_context && callback_data_context) {
-                                (iinfo->free_data_context)(callback_data_context,
-                                                           iinfo);
-                            }
                         }
                         break;
 
@@ -743,6 +741,7 @@
                             }
                         }
                         reqinfo->mode = MODE_GET_STASH;
+			free_data_context = 0;
                         break;
 #endif  /* NETSNMP_FEATURE_REMOVE_STASH_CACHE */
 
@@ -775,12 +774,7 @@
                              */
                             if (iinfo->flags & NETSNMP_ITERATOR_FLAG_SORTED)
                                 request_count--;
-                        
-                        } else {
-                            if (iinfo->free_data_context && callback_data_context) {
-                                (iinfo->free_data_context)(callback_data_context,
-                                                           iinfo);
-                            }
+			    free_data_context = 0;
                         }
                         break;
 
@@ -790,16 +784,24 @@
                     case MODE_SET_UNDO:
                     case MODE_SET_COMMIT:
                         /* needed processing already done in RESERVE1 */
+			free_data_context = 0; // XXX: suspicious!
                         break;
 #endif /* NETSNMP_NO_WRITE_SUPPORT */
 
                     default:
                         snmp_log(LOG_ERR,
                                  "table_iterator called with unsupported mode\n");
+			free_data_context = 0; // XXX: suspicious!
                         break;  /* XXX return */
                 
                     }
                 }
+                        
+		if (free_data_context && iinfo->free_data_context && callback_data_context) {
+		    (iinfo->free_data_context)(callback_data_context,
+					       iinfo);
+		    callback_data_context = NULL;
+		}
 
                 /* Is there any point in carrying on? */
                 if (!request_count)
