commit 2351cead7a693c53f3ec8329e84ca15add55c945 Author: Karsten Loesing karsten.loesing@gmx.net Date: Mon Jun 16 07:32:55 2014 +0200
Accept [SP|TAB]+ as delimiter in two places.
There have been at least two relays including an additional SP after their nickname in server and extra-info descriptors. The spec stays vague about whether this is allowed or not, but the directory authorities seem to accept these descriptors just fine. We should also accept these descriptors.
We should probably accept [SP|TAB]+ in more places. But right now we're losing data by discarding these descriptors. Let's do the quick fix now and the potentially cleaner fix later.
Fixes #12403. --- .../descriptor/impl/ExtraInfoDescriptorImpl.java | 13 +++++++++++-- .../torproject/descriptor/impl/ServerDescriptorImpl.java | 13 +++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java index a533113..5951da0 100644 --- a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java +++ b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java @@ -201,8 +201,17 @@ public class ExtraInfoDescriptorImpl extends DescriptorImpl private void parseExtraInfoLine(String line, String lineNoOpt, String[] partsNoOpt) throws DescriptorParseException { if (partsNoOpt.length != 3) { - throw new DescriptorParseException("Illegal line '" + line - + "' in extra-info descriptor."); + /* Also accept [SP|TAB]+ where we'd previously only accept SP as + * delimiter. This is a hotfix for #12403, because we're currently + * not storing valid descriptors. A better place to implement this + * would probably be in DescriptorImpl. */ + partsNoOpt = line.startsWith("opt ") ? + line.substring("opt ".length()).split("[ \t]+") : + line.split("[ \t]+"); + if (partsNoOpt.length != 3) { + throw new DescriptorParseException("Illegal line '" + line + + "' in extra-info descriptor."); + } } this.nickname = ParseHelper.parseNickname(line, partsNoOpt[1]); this.fingerprint = ParseHelper.parseTwentyByteHexString(line, diff --git a/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java b/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java index 52d49b0..69ffcd8 100644 --- a/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java +++ b/src/org/torproject/descriptor/impl/ServerDescriptorImpl.java @@ -170,8 +170,17 @@ public class ServerDescriptorImpl extends DescriptorImpl private void parseRouterLine(String line, String lineNoOpt, String[] partsNoOpt) throws DescriptorParseException { if (partsNoOpt.length != 6) { - throw new DescriptorParseException("Illegal line '" + line - + "' in server descriptor."); + /* Also accept [SP|TAB]+ where we'd previously only accept SP as + * delimiter. This is a hotfix for #12403, because we're currently + * not storing valid descriptors. A better place to implement this + * would probably be in DescriptorImpl. */ + partsNoOpt = line.startsWith("opt ") ? + line.substring("opt ".length()).split("[ \t]+") : + line.split("[ \t]+"); + if (partsNoOpt.length != 6) { + throw new DescriptorParseException("Illegal line '" + line + + "' in server descriptor."); + } } this.nickname = ParseHelper.parseNickname(line, partsNoOpt[1]); this.address = ParseHelper.parseIpv4Address(line, partsNoOpt[2]);