diff options
author | teor <teor@torproject.org> | 2019-01-10 20:39:10 +1000 |
---|---|---|
committer | teor <teor@torproject.org> | 2019-02-19 21:41:43 +1000 |
commit | a1f8558628881216917814989d293a028f9e48d7 (patch) | |
tree | de9de7e6d139de5753d4d1ba95b172a78b4fcfa4 /src/feature/relay/router.c | |
parent | 9cab988696b6f86f9b3b744c5694bee7d2a6cf70 (diff) | |
download | tor-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.c | 57 |
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; |