aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2013-03-19 16:16:48 -0400
committerNick Mathewson <nickm@torproject.org>2013-03-19 16:16:48 -0400
commit323cb655be7802a3f527bfa4278478d9fbd23944 (patch)
treecf195279ab47ce79076c935d97c89be3e0fa1fdb
parent6f20a74d52741cce521cf03b8afee570e3cb367b (diff)
parentadfc3de83308982f91c88e1e6c68dc37d2467746 (diff)
downloadtor-323cb655be7802a3f527bfa4278478d9fbd23944.tar
tor-323cb655be7802a3f527bfa4278478d9fbd23944.tar.gz
Merge remote-tracking branch 'public/bug7164_diagnostic' into maint-0.2.4
-rw-r--r--changes/bug7164_diagnostic4
-rw-r--r--src/or/microdesc.c20
-rw-r--r--src/or/microdesc.h4
3 files changed, 18 insertions, 10 deletions
diff --git a/changes/bug7164_diagnostic b/changes/bug7164_diagnostic
new file mode 100644
index 000000000..8bedfc4bd
--- /dev/null
+++ b/changes/bug7164_diagnostic
@@ -0,0 +1,4 @@
+ o Minor features (bug diagnostic):
+ - If we fail to free a microdescriptor because of bug #7164, log
+ the filename and line number from which we tried to free it.
+ This should help us finally fix #7164.
diff --git a/src/or/microdesc.c b/src/or/microdesc.c
index f9dbcac80..d9955c7b4 100644
--- a/src/or/microdesc.c
+++ b/src/or/microdesc.c
@@ -550,7 +550,7 @@ microdesc_check_counts(void)
/** Deallocate a single microdescriptor. Note: the microdescriptor MUST have
* previously been removed from the cache if it had ever been inserted. */
void
-microdesc_free(microdesc_t *md)
+microdesc_free_(microdesc_t *md, const char *fname, int lineno)
{
if (!md)
return;
@@ -561,12 +561,12 @@ microdesc_free(microdesc_t *md)
microdesc_cache_t *cache = get_microdesc_cache();
microdesc_t *md2 = HT_FIND(microdesc_map, &cache->map, md);
if (md2 == md) {
- log_warn(LD_BUG, "microdesc_free() called, but md was still in "
- "microdesc_map");
+ log_warn(LD_BUG, "microdesc_free() called from %s:%d, but md was still "
+ "in microdesc_map", fname, lineno);
HT_REMOVE(microdesc_map, &cache->map, md);
} else {
- log_warn(LD_BUG, "microdesc_free() called with held_in_map set, but "
- "microdesc was not in the map.");
+ log_warn(LD_BUG, "microdesc_free() called from %s:%d with held_in_map "
+ "set, but microdesc was not in the map.", fname, lineno);
}
tor_fragile_assert();
}
@@ -580,11 +580,13 @@ microdesc_free(microdesc_t *md)
}
});
if (found) {
- log_warn(LD_BUG, "microdesc_free() called, but md was still referenced "
- "%d node(s); held_by_nodes == %u", found, md->held_by_nodes);
+ log_warn(LD_BUG, "microdesc_free() called from %s:%d, but md was still "
+ "referenced %d node(s); held_by_nodes == %u",
+ fname, lineno, found, md->held_by_nodes);
} else {
- log_warn(LD_BUG, "microdesc_free() called with held_by_nodes set to %u, "
- "but md was not referenced by any nodes", md->held_by_nodes);
+ log_warn(LD_BUG, "microdesc_free() called from %s:%d with held_by_nodes "
+ "set to %u, but md was not referenced by any nodes",
+ fname, lineno, md->held_by_nodes);
}
tor_fragile_assert();
}
diff --git a/src/or/microdesc.h b/src/or/microdesc.h
index 4e58aa33f..7adb8c68a 100644
--- a/src/or/microdesc.h
+++ b/src/or/microdesc.h
@@ -39,7 +39,9 @@ smartlist_t *microdesc_list_missing_digest256(networkstatus_t *ns,
int downloadable_only,
digestmap_t *skip);
-void microdesc_free(microdesc_t *md);
+void microdesc_free_(microdesc_t *md, const char *fname, int line);
+#define microdesc_free(md) \
+ microdesc_free_((md), __FILE__, __LINE__)
void microdesc_free_all(void);
void update_microdesc_downloads(time_t now);