aboutsummaryrefslogtreecommitdiff
path: root/src/feature/relay/router.c
diff options
context:
space:
mode:
authorteor <teor@torproject.org>2019-01-10 20:39:10 +1000
committerteor <teor@torproject.org>2019-02-19 21:41:43 +1000
commita1f8558628881216917814989d293a028f9e48d7 (patch)
treede9de7e6d139de5753d4d1ba95b172a78b4fcfa4 /src/feature/relay/router.c
parent9cab988696b6f86f9b3b744c5694bee7d2a6cf70 (diff)
downloadtor-a1f8558628881216917814989d293a028f9e48d7.tar.gz
tor-a1f8558628881216917814989d293a028f9e48d7.zip
router: Move extrainfo signing into its own function
This refactoring improves the structure of router_build_fresh_descriptor(). Preparation for testing 29017 and 20918.
Diffstat (limited to 'src/feature/relay/router.c')
-rw-r--r--src/feature/relay/router.c57
1 files changed, 39 insertions, 18 deletions
diff --git a/src/feature/relay/router.c b/src/feature/relay/router.c
index 03af9aacd4..0e872663f8 100644
--- a/src/feature/relay/router.c
+++ b/src/feature/relay/router.c
@@ -2158,6 +2158,40 @@ router_update_extrainfo_descriptor_body(extrainfo_t *ei)
return 0;
}
+/** Allocate and return a fresh, signed extrainfo for this OR, based on the
+ * routerinfo ri.
+ *
+ * If ri is NULL, logs a BUG() warning and returns NULL.
+ * Caller is responsible for freeing the generated extrainfo.
+ */
+static extrainfo_t *
+router_build_signed_extrainfo(const routerinfo_t *ri)
+{
+ int result = -1;
+ extrainfo_t *ei = NULL;
+
+ if (BUG(!ri))
+ return NULL;
+
+ ei = router_build_fresh_extrainfo(ri);
+ /* router_build_fresh_extrainfo() should not fail. */
+ if (BUG(!ei))
+ goto err;
+
+ result = router_update_extrainfo_descriptor_body(ei);
+ if (result < 0)
+ goto err;
+
+ goto done;
+
+ err:
+ extrainfo_free(ei);
+ return NULL;
+
+ done:
+ return ei;
+}
+
/** Set the fields in ri that depend on ei.
*
* If ei is NULL, logs a BUG() warning and zeroes the relevant fields.
@@ -2268,26 +2302,13 @@ router_build_fresh_descriptor(routerinfo_t **r, extrainfo_t **e)
goto err;
}
- ei = router_build_fresh_extrainfo(ri);
- /* Failing to create an ei is not an error, but at this stage,
- * router_build_fresh_extrainfo() should not fail. */
- if (BUG(!ei))
- goto skip_ei;
-
- result = router_update_extrainfo_descriptor_body(ei);
- if (result < 0)
- goto skip_ei;
-
- router_update_routerinfo_from_extrainfo(ri, ei);
+ ei = router_build_signed_extrainfo(ri);
- /* TODO: disentangle these GOTOs, or split into another function. */
- goto ei_ok;
-
- skip_ei:
- extrainfo_free(ei);
- ei = NULL;
+ /* Failing to create an ei is not an error. */
+ if (ei) {
+ router_update_routerinfo_from_extrainfo(ri, ei);
+ }
- ei_ok:
result = router_update_routerinfo_descriptor_body(ri);
if (result < 0)
goto err;