summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorteor <teor@torproject.org>2019-06-25 12:29:28 +1000
committerteor <teor@torproject.org>2019-06-25 12:29:28 +1000
commit2663bca39246cdf54fe43593b2e632a7bbe9af97 (patch)
treef16511d59bd096b7bc5208fe3a92dbc762e15341
parentaec359ef6264881545d5ff313071722479ecb0de (diff)
parentd9f49e9bc1b19e2d3246e696374cde964a8e4673 (diff)
downloadtor-2663bca39246cdf54fe43593b2e632a7bbe9af97.tar.gz
tor-2663bca39246cdf54fe43593b2e632a7bbe9af97.zip
Merge branch 'bug30958_041' into bug30958_master
-rw-r--r--changes/bug309585
-rw-r--r--src/feature/relay/router.c12
2 files changed, 12 insertions, 5 deletions
diff --git a/changes/bug30958 b/changes/bug30958
new file mode 100644
index 0000000000..374c8e46f7
--- /dev/null
+++ b/changes/bug30958
@@ -0,0 +1,5 @@
+ o Minor bugfixes (statistics):
+ - Stop removing the ed25519 signature if the extra info file is too big.
+ If the signature data was removed, but the keyword was kept, this could
+ result in an unparseable extra info file. Fixes bug 30958;
+ bugfix on 0.2.7.2-alpha.
diff --git a/src/feature/relay/router.c b/src/feature/relay/router.c
index 6b33265294..782084caa3 100644
--- a/src/feature/relay/router.c
+++ b/src/feature/relay/router.c
@@ -3368,11 +3368,13 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo,
while (strlen(s) > MAX_EXTRAINFO_UPLOAD_SIZE - DIROBJ_MAX_SIG_LEN) {
/* So long as there are at least two chunks (one for the initial
* extra-info line and one for the router-signature), we can keep removing
- * things. */
- if (smartlist_len(chunks) > 2) {
- /* We remove the next-to-last element (remember, len-1 is the last
- element), since we need to keep the router-signature element. */
- int idx = smartlist_len(chunks) - 2;
+ * things. If emit_ed_sigs is true, we also keep 2 additional chunks at the
+ * end for the ed25519 signature. */
+ const int required_chunks = emit_ed_sigs ? 4 : 2;
+ if (smartlist_len(chunks) > required_chunks) {
+ /* We remove the next-to-last or 4th-last element (remember, len-1 is the
+ * last element), since we need to keep the router-signature elements. */
+ int idx = smartlist_len(chunks) - required_chunks;
char *e = smartlist_get(chunks, idx);
smartlist_del_keeporder(chunks, idx);
log_warn(LD_GENERAL, "We just generated an extra-info descriptor "