summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorteor <teor@torproject.org>2019-06-24 21:19:49 +1000
committerteor <teor@torproject.org>2019-06-24 21:30:03 +1000
commit5beb32d3d9a9640e515e6369d3a908e93b8895ef (patch)
tree1fd97a6b8483a3ebafd58b7f57cc8f0c485ce31c
parent0ec4ebd00d5ccd75068348700c641dd17837efe9 (diff)
downloadtor-5beb32d3d9a9640e515e6369d3a908e93b8895ef.tar.gz
tor-5beb32d3d9a9640e515e6369d3a908e93b8895ef.zip
stats: 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.
-rw-r--r--changes/bug309585
-rw-r--r--src/or/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/or/router.c b/src/or/router.c
index c416474226..3fce45115c 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -3252,11 +3252,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 "