commit a09b1e038fc97dada370e01ad8fd0c4f81b90c12 Author: Damian Johnson atagar@torproject.org Date: Thu Oct 4 09:39:27 2012 -0700
Fix when router status entries have duplicate lines
Spotted a bug with the RouterStatusEntry where we have an undefined 'key' variable when validating that we don't have any duplicate entries. Turns out that this use case wasn't being tested so added a unit test to exercise the bug first. --- stem/descriptor/networkstatus.py | 2 +- test/unit/descriptor/networkstatus/entry.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/stem/descriptor/networkstatus.py b/stem/descriptor/networkstatus.py index c27f587..fa02e44 100644 --- a/stem/descriptor/networkstatus.py +++ b/stem/descriptor/networkstatus.py @@ -1114,7 +1114,7 @@ class RouterStatusEntry(stem.descriptor.Descriptor):
# most attributes can only appear at most once if validate and len(values) > 1 and keyword in ('r', 's', 'v', 'w', 'p'): - raise ValueError("Router status entries can only have a single '%s' line, got %i:\n%s" % (key, len(values), content)) + raise ValueError("Router status entries can only have a single '%s' line, got %i:\n%s" % (keyword, len(values), content))
if keyword == 'r': # "r" nickname identity digest publication IP ORPort DirPort diff --git a/test/unit/descriptor/networkstatus/entry.py b/test/unit/descriptor/networkstatus/entry.py index a0ece4d..6400f2b 100644 --- a/test/unit/descriptor/networkstatus/entry.py +++ b/test/unit/descriptor/networkstatus/entry.py @@ -100,6 +100,20 @@ class TestRouterStatusEntry(unittest.TestCase): entry = RouterStatusEntry(content) self.assertEqual("Tor 0.2.2.35", entry.version_line)
+ def test_duplicate_lines(self): + """ + Duplicates linesin the entry. + """ + + lines = get_router_status_entry(content = True).split("\n") + + for i in xrange(len(lines)): + content = "\n".join(lines[:i] + [lines[i]] + lines[i:]) + self.assertRaises(ValueError, RouterStatusEntry, content) + + entry = RouterStatusEntry(content, False) + self.assertEqual("caerSidi", entry.nickname) + def test_missing_r_field(self): """ Excludes fields from the 'r' line.
tor-commits@lists.torproject.org