From 09cfd9b89e8c9dcbe57635fb6be9eb5a5b99a5d9 Mon Sep 17 00:00:00 2001 From: Calum Lind Date: Sat, 18 May 2019 11:12:01 +0100 Subject: [PATCH] [bencode] Fix unhandled TypeError with string Passing a non-bencoded dict to bdecode resulted in an unhandled TypeError. - Catch TypeError in decode_func. - Add bdecode tests. - Replace KeyError and IndexError with base LookupError. --- deluge/bencode.py | 2 +- deluge/tests/test_bencode.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/deluge/bencode.py b/deluge/bencode.py index 420ccf646..0c2674b9b 100644 --- a/deluge/bencode.py +++ b/deluge/bencode.py @@ -84,7 +84,7 @@ decode_func[b'9'] = decode_string def bdecode(x): try: r, __ = decode_func[x[0:1]](x, 0) - except (IndexError, KeyError, ValueError): + except (LookupError, TypeError, ValueError): raise BTFailure('Not a valid bencoded string') else: return r diff --git a/deluge/tests/test_bencode.py b/deluge/tests/test_bencode.py index bdad16fa4..b49c21f83 100644 --- a/deluge/tests/test_bencode.py +++ b/deluge/tests/test_bencode.py @@ -21,4 +21,14 @@ class BencodeTestCase(unittest.TestCase): bencode.bencode({b'info': metainfo}) def test_bencode_unicode_value(self): + self.assertEqual(bencode.bencode(b'abc'), b'3:abc') self.assertEqual(bencode.bencode('abc'), b'3:abc') + + def test_bdecode(self): + self.assertEqual(bencode.bdecode(b'3:dEf'), b'dEf') + with self.assertRaises(bencode.BTFailure): + bencode.bdecode('dEf') + with self.assertRaises(bencode.BTFailure): + bencode.bdecode(b'dEf') + with self.assertRaises(bencode.BTFailure): + bencode.bdecode({'dEf': 123})