summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2016-05-25 16:12:10 -0400
committerNick Mathewson <nickm@torproject.org>2016-05-25 16:12:10 -0400
commite32281b00095dbc764e995cf57290c9c1b0c9660 (patch)
tree9335c50c099b5848c21f5307b61d1263ef758ca9
parent693e48a5a4dc0bd537e00134606268b6b91afce0 (diff)
parentf2d614c3d93aceac4954f7cd593213a5fcfbb123 (diff)
downloadtor-e32281b00095dbc764e995cf57290c9c1b0c9660.tar.gz
tor-e32281b00095dbc764e995cf57290c9c1b0c9660.zip
Merge branch 'maint-0.2.8' into release-0.2.8
-rw-r--r--src/or/routerlist.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index d49814f056..a08b5f3190 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -2938,6 +2938,19 @@ signed_descriptor_free(signed_descriptor_t *sd)
tor_free(sd);
}
+/** Copy src into dest, and steal all references inside src so that when
+ * we free src, we don't mess up dest. */
+static void
+signed_descriptor_move(signed_descriptor_t *dest,
+ signed_descriptor_t *src)
+{
+ tor_assert(dest != src);
+ memcpy(dest, src, sizeof(signed_descriptor_t));
+ src->signed_descriptor_body = NULL;
+ src->signing_key_cert = NULL;
+ dest->routerlist_index = -1;
+}
+
/** Extract a signed_descriptor_t from a general routerinfo, and free the
* routerinfo.
*/
@@ -2947,10 +2960,7 @@ signed_descriptor_from_routerinfo(routerinfo_t *ri)
signed_descriptor_t *sd;
tor_assert(ri->purpose == ROUTER_PURPOSE_GENERAL);
sd = tor_malloc_zero(sizeof(signed_descriptor_t));
- memcpy(sd, &(ri->cache_info), sizeof(signed_descriptor_t));
- sd->routerlist_index = -1;
- ri->cache_info.signed_descriptor_body = NULL;
- ri->cache_info.signing_key_cert = NULL;
+ signed_descriptor_move(sd, &ri->cache_info);
routerinfo_free(ri);
return sd;
}
@@ -3436,9 +3446,7 @@ routerlist_reparse_old(routerlist_t *rl, signed_descriptor_t *sd)
0, 1, NULL, NULL);
if (!ri)
return NULL;
- memcpy(&ri->cache_info, sd, sizeof(signed_descriptor_t));
- sd->signed_descriptor_body = NULL; /* Steal reference. */
- ri->cache_info.routerlist_index = -1;
+ signed_descriptor_move(&ri->cache_info, sd);
routerlist_remove_old(rl, sd, -1);