]> Cypherpunks.ru repositories - pyderasn.git/commitdiff
Possible TypeError under Py2
authorSergey Matveev <stargrave@stargrave.org>
Mon, 23 Jul 2018 10:36:02 +0000 (13:36 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Mon, 23 Jul 2018 10:36:02 +0000 (13:36 +0300)
VERSION
doc/news.rst
pyderasn.py
tests/test_pyderasn.py

diff --git a/VERSION b/VERSION
index 2c0733315e415bfb5e5b353f9996ecd964d395b2..e4fba2183587225f216eeada4c78dfab6b2e65f5 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-3.11
+3.12
index 24977ab78c9961b0010665c274c8b13069fb3432..c1c069af3ede34de4cc989d0c6b89a9d3100ce40 100644 (file)
@@ -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
index 104ad3193641142ef1ae8c69d47281a0308eb36d..b9bc9dae515564a24dcc052005754d54993fca03 100755 (executable)
@@ -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",
                     )
index 03e10813999f56ff20276290ff170a9992229c42..147e3cd30457860db037ab519467e05dce6c2933 100644 (file)
@@ -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