Commit a79f4c21 authored by Serhiy Storchaka's avatar Serhiy Storchaka Committed by GitHub

bpo-30070: Fixed leaks and crashes in errors handling in the parser module. (#1131)

parent d90045f3
import copy
import parser import parser
import pickle
import unittest import unittest
import operator import operator
import struct import struct
...@@ -424,6 +426,52 @@ class IllegalSyntaxTestCase(unittest.TestCase): ...@@ -424,6 +426,52 @@ class IllegalSyntaxTestCase(unittest.TestCase):
# not even remotely valid: # not even remotely valid:
self.check_bad_tree((1, 2, 3), "<junk>") self.check_bad_tree((1, 2, 3), "<junk>")
def test_illegal_terminal(self):
tree = \
(257,
(269,
(270,
(271,
(277,
(1,))),
(4, ''))),
(4, ''),
(0, ''))
self.check_bad_tree(tree, "too small items in terminal node")
tree = \
(257,
(269,
(270,
(271,
(277,
(1, b'pass'))),
(4, ''))),
(4, ''),
(0, ''))
self.check_bad_tree(tree, "non-string second item in terminal node")
tree = \
(257,
(269,
(270,
(271,
(277,
(1, 'pass', '0', 0))),
(4, ''))),
(4, ''),
(0, ''))
self.check_bad_tree(tree, "non-integer third item in terminal node")
tree = \
(257,
(269,
(270,
(271,
(277,
(1, 'pass', 0, 0))),
(4, ''))),
(4, ''),
(0, ''))
self.check_bad_tree(tree, "too many items in terminal node")
def test_illegal_yield_1(self): def test_illegal_yield_1(self):
# Illegal yield statement: def f(): return 1; yield 1 # Illegal yield statement: def f(): return 1; yield 1
tree = \ tree = \
...@@ -628,6 +676,24 @@ class IllegalSyntaxTestCase(unittest.TestCase): ...@@ -628,6 +676,24 @@ class IllegalSyntaxTestCase(unittest.TestCase):
(4, ''), (0, '')) (4, ''), (0, ''))
self.check_bad_tree(tree, "from import fred") self.check_bad_tree(tree, "from import fred")
def test_illegal_encoding(self):
# Illegal encoding declaration
tree = \
(339,
(257, (0, '')))
self.check_bad_tree(tree, "missed encoding")
tree = \
(339,
(257, (0, '')),
b'iso-8859-1')
self.check_bad_tree(tree, "non-string encoding")
tree = \
(339,
(257, (0, '')),
'\udcff')
with self.assertRaises(UnicodeEncodeError):
parser.sequence2st(tree)
class CompileTestCase(unittest.TestCase): class CompileTestCase(unittest.TestCase):
...@@ -772,6 +838,21 @@ class STObjectTestCase(unittest.TestCase): ...@@ -772,6 +838,21 @@ class STObjectTestCase(unittest.TestCase):
self.assertRaises(TypeError, operator.lt, st1, 1815) self.assertRaises(TypeError, operator.lt, st1, 1815)
self.assertRaises(TypeError, operator.gt, b'waterloo', st2) self.assertRaises(TypeError, operator.gt, b'waterloo', st2)
def test_copy_pickle(self):
sts = [
parser.expr('2 + 3'),
parser.suite('x = 2; y = x + 3'),
parser.expr('list(x**3 for x in range(20))')
]
for st in sts:
st_copy = copy.copy(st)
self.assertEqual(st_copy.totuple(), st.totuple())
st_copy = copy.deepcopy(st)
self.assertEqual(st_copy.totuple(), st.totuple())
for proto in range(pickle.HIGHEST_PROTOCOL+1):
st_copy = pickle.loads(pickle.dumps(st, proto))
self.assertEqual(st_copy.totuple(), st.totuple())
check_sizeof = support.check_sizeof check_sizeof = support.check_sizeof
@support.cpython_only @support.cpython_only
......
...@@ -313,6 +313,8 @@ Extension Modules ...@@ -313,6 +313,8 @@ Extension Modules
Library Library
------- -------
- bpo-30070: Fixed leaks and crashes in errors handling in the parser module.
- bpo-22352: Column widths in the output of dis.dis() are now adjusted for - bpo-22352: Column widths in the output of dis.dis() are now adjusted for
large line numbers and instruction offsets. large line numbers and instruction offsets.
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment