summaryrefslogtreecommitdiff
path: root/src/or/rendcache.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/or/rendcache.c')
-rw-r--r--src/or/rendcache.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/or/rendcache.c b/src/or/rendcache.c
index 0fe5a47d9c..3d3beb0138 100644
--- a/src/or/rendcache.c
+++ b/src/or/rendcache.c
@@ -349,6 +349,17 @@ cache_failure_intro_lookup(const uint8_t *identity, const char *service_id,
return 0;
}
+/** Allocate a new cache failure intro object and copy the content from
+ * <b>entry</b> to this newly allocated object. Return it. */
+static rend_cache_failure_intro_t *
+cache_failure_intro_dup(const rend_cache_failure_intro_t *entry)
+{
+ rend_cache_failure_intro_t *ent_dup =
+ rend_cache_failure_intro_entry_new(entry->failure_type);
+ ent_dup->created_ts = entry->created_ts;
+ return ent_dup;
+}
+
/** Add an intro point failure to the failure cache using the relay
* <b>identity</b> and service ID <b>service_id</b>. Record the
* <b>failure</b> in that object. */
@@ -398,12 +409,15 @@ validate_intro_point_failure(const rend_service_descriptor_t *desc,
found = cache_failure_intro_lookup(identity, service_id, &entry);
if (found) {
+ /* Dup here since it will be freed at the end when removing the
+ * original entry in the cache. */
+ rend_cache_failure_intro_t *ent_dup = cache_failure_intro_dup(entry);
/* This intro point is in our cache, discard it from the descriptor
* because chances are that it's unusable. */
SMARTLIST_DEL_CURRENT(desc->intro_nodes, intro);
rend_intro_point_free(intro);
/* Keep it for our new entry. */
- digestmap_set(new_entry->intro_failures, (char *) identity, entry);
+ digestmap_set(new_entry->intro_failures, (char *) identity, ent_dup);
continue;
}
} SMARTLIST_FOREACH_END(intro);