From a34b3e75db1e13750560c89c2b80821f2e5d0d1f Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Mon, 23 Jul 2018 13:36:02 +0300 Subject: [PATCH] Possible TypeError under Py2 --- VERSION | 2 +- doc/news.rst | 6 ++++ pyderasn.py | 6 ++-- tests/test_pyderasn.py | 72 ++++++++++++++++++++++++++++++++++++------ 4 files changed, 72 insertions(+), 14 deletions(-) diff --git a/VERSION b/VERSION index 2c07333..e4fba21 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.11 +3.12 diff --git a/doc/news.rst b/doc/news.rst index 24977ab..c1c069a 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -1,6 +1,12 @@ News ==== +.. _release3.12: + +3.12 +---- +* Fix possible uncaught TypeError in Py2 with zero bytes inside the value. + .. _release3.11: 3.11 diff --git a/pyderasn.py b/pyderasn.py index 104ad31..b9bc9da 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -3529,7 +3529,7 @@ class UTCTime(CommonString): if len(value_decoded) == LEN_YYMMDDHHMMSSZ: try: datetime.strptime(value_decoded, self.fmt) - except ValueError: + except (TypeError, ValueError): raise DecodeError("invalid UTCTime format") return value else: @@ -3630,7 +3630,7 @@ class GeneralizedTime(UTCTime): if len(value_decoded) == LEN_YYYYMMDDHHMMSSZ: try: datetime.strptime(value_decoded, self.fmt) - except ValueError: + except (TypeError, ValueError): raise DecodeError( "invalid GeneralizedTime (without ms) format", ) @@ -3638,7 +3638,7 @@ class GeneralizedTime(UTCTime): elif len(value_decoded) >= LEN_YYYYMMDDHHMMSSDMZ: try: datetime.strptime(value_decoded, self.fmt_ms) - except ValueError: + except (TypeError, ValueError): raise DecodeError( "invalid GeneralizedTime (with ms) format", ) diff --git a/tests/test_pyderasn.py b/tests/test_pyderasn.py index 03e1081..147e3cd 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -77,6 +77,9 @@ from pyderasn import InvalidOID from pyderasn import InvalidValueType from pyderasn import len_decode from pyderasn import len_encode +from pyderasn import LEN_YYMMDDHHMMSSZ +from pyderasn import LEN_YYYYMMDDHHMMSSDMZ +from pyderasn import LEN_YYYYMMDDHHMMSSZ from pyderasn import LENINDEF from pyderasn import NotEnoughData from pyderasn import Null @@ -3609,12 +3612,47 @@ class TestGeneralizedTime(TimeMixin, CommonMixin, TestCase): datetime(2010, 1, 2, 3, 4, 5, 0), ) - def test_encoding(self): - raw = GeneralizedTime(b"20100102030405Z").encode() - with assertRaisesRegex(self, DecodeError, "encoding"): - GeneralizedTime().decode(raw.replace(b"201001", "привет".encode("utf-8"))) + @given( + binary( + min_size=(LEN_YYYYMMDDHHMMSSZ - 1) // 2, + max_size=(LEN_YYYYMMDDHHMMSSZ - 1) // 2, + ), + binary(min_size=1, max_size=1), + binary( + min_size=(LEN_YYYYMMDDHHMMSSZ - 1) // 2, + max_size=(LEN_YYYYMMDDHHMMSSZ - 1) // 2, + ), + ) + def test_junk(self, part0, part1, part2): + junk = part0 + part1 + part2 + assume(not (set(junk) <= set(digits.encode("ascii")))) with self.assertRaises(DecodeError): - GeneralizedTime().decode(raw.replace(b"20100", b"hello")) + GeneralizedTime().decode( + GeneralizedTime.tag_default + + len_encode(len(junk)) + + junk + ) + + @given( + binary( + min_size=(LEN_YYYYMMDDHHMMSSDMZ - 1) // 2, + max_size=(LEN_YYYYMMDDHHMMSSDMZ - 1) // 2, + ), + binary(min_size=1, max_size=1), + binary( + min_size=(LEN_YYYYMMDDHHMMSSDMZ - 1) // 2, + max_size=(LEN_YYYYMMDDHHMMSSDMZ - 1) // 2, + ), + ) + def test_junk_dm(self, part0, part1, part2): + junk = part0 + part1 + part2 + assume(not (set(junk) <= set(digits.encode("ascii")))) + with self.assertRaises(DecodeError): + GeneralizedTime().decode( + GeneralizedTime.tag_default + + len_encode(len(junk)) + + junk + ) class TestUTCTime(TimeMixin, CommonMixin, TestCase): @@ -3680,12 +3718,26 @@ class TestUTCTime(TimeMixin, CommonMixin, TestCase): 1900 + year, ) - def test_encoding(self): - raw = UTCTime(b"910506234540Z").encode() - with assertRaisesRegex(self, DecodeError, "encoding"): - UTCTime().decode(raw.replace(b"910506", "привет".encode("utf-8"))) + @given( + binary( + min_size=(LEN_YYMMDDHHMMSSZ - 1) // 2, + max_size=(LEN_YYMMDDHHMMSSZ - 1) // 2, + ), + binary(min_size=1, max_size=1), + binary( + min_size=(LEN_YYMMDDHHMMSSZ - 1) // 2, + max_size=(LEN_YYMMDDHHMMSSZ - 1) // 2, + ), + ) + def test_junk(self, part0, part1, part2): + junk = part0 + part1 + part2 + assume(not (set(junk) <= set(digits.encode("ascii")))) with self.assertRaises(DecodeError): - UTCTime().decode(raw.replace(b"91050", b"hello")) + UTCTime().decode( + UTCTime.tag_default + + len_encode(len(junk)) + + junk + ) @composite -- 2.44.0