Sfoglia il codice sorgente

HT_NEXT invalidates the last iterator; fix rmv-related segfault.

svn:r5458
Nick Mathewson 20 anni fa
parent
commit
72cb64406a
2 ha cambiato i file con 16 aggiunte e 13 eliminazioni
  1. 15 11
      src/common/container.c
  2. 1 2
      src/common/ht.h

+ 15 - 11
src/common/container.c

@@ -756,26 +756,28 @@ digestmap_iter_next(digestmap_t *map, digestmap_iter_t *iter)
 strmap_iter_t *
 strmap_iter_next_rmv(strmap_t *map, strmap_iter_t *iter)
 {
-  strmap_iter_t *next;
+  strmap_entry_t *rmv;
   tor_assert(map);
   tor_assert(iter);
-  next = HT_NEXT_RMV(strmap_tree, &map->head, iter);
-  if (*iter) {
-    tor_free((*iter)->key);
-    tor_free(*iter);
-  }
-  return next;
+  tor_assert(*iter);
+  rmv = *iter;
+  iter = HT_NEXT_RMV(strmap_tree, &map->head, iter);
+  tor_free(rmv->key);
+  tor_free(rmv);
+  return iter;
 }
 
 digestmap_iter_t *
 digestmap_iter_next_rmv(digestmap_t *map, digestmap_iter_t *iter)
 {
-  digestmap_iter_t *next;
+  digestmap_entry_t *rmv;
   tor_assert(map);
   tor_assert(iter);
-  next = HT_NEXT_RMV(digestmap_tree, &map->head, iter);
-  tor_free(*iter);
-  return next;
+  tor_assert(*iter);
+  rmv = *iter;
+  iter = HT_NEXT_RMV(digestmap_tree, &map->head, iter);
+  tor_free(rmv);
+  return iter;
 }
 
 /** Set *keyp and *valp to the current entry pointed to by iter.
@@ -784,6 +786,7 @@ void
 strmap_iter_get(strmap_iter_t *iter, const char **keyp, void **valp)
 {
   tor_assert(iter);
+  tor_assert(*iter);
   tor_assert(keyp);
   tor_assert(valp);
   *keyp = (*iter)->key;
@@ -794,6 +797,7 @@ void
 digestmap_iter_get(digestmap_iter_t *iter, const char **keyp, void **valp)
 {
   tor_assert(iter);
+  tor_assert(*iter);
   tor_assert(keyp);
   tor_assert(valp);
   *keyp = (*iter)->key;

+ 1 - 2
src/common/ht.h

@@ -215,7 +215,7 @@ ht_string_hash(const char *s)
   static __inline struct type **                                        \
   name##_HT_START(struct name *head)                                    \
   {                                                                     \
-    unsigned b = 0;                                                 \
+    unsigned b = 0;                                                     \
     while (b < head->hth_table_length) {                                \
       if (head->hth_table[b])                                           \
         return &head->hth_table[b];                                     \
@@ -262,7 +262,6 @@ ht_string_hash(const char *s)
     }                                                                   \
   }
 
-
 #if 0
 /* Helpers for an iterator type that saves some mod operations at the expense
  * of many branches. Not worth it, it seems. */