Skip to content

Commit

Permalink
pythongh-126991: Add tests for unpickling bad object state
Browse files Browse the repository at this point in the history
This catches a memory leak in loading the BUILD opcode.
  • Loading branch information
serhiy-storchaka committed Nov 19, 2024
1 parent 29cbcbd commit 80a8275
Showing 1 changed file with 35 additions and 0 deletions.
35 changes: 35 additions & 0 deletions Lib/test/pickletester.py
Original file line number Diff line number Diff line change
Expand Up @@ -1357,6 +1357,41 @@ def test_bad_newobj_ex(self):
self.check_unpickling_error(error, b'cbuiltins\nint\nN}\x92.')
self.check_unpickling_error(error, b'cbuiltins\nint\n)N\x92.')

def test_bad_state(self):
c = C()
c.x = None
base = b'c__main__\nC\n)\x81'
self.assertEqual(self.loads(base + b'}X\x01\x00\x00\x00xNsb.'), c)
self.assertEqual(self.loads(base + b'N}X\x01\x00\x00\x00xNs\x86b.'), c)
# non-hashable dict key
self.check_unpickling_error(TypeError, base + b'}]Nsb.')
# state = list
error = (pickle.UnpicklingError, AttributeError)
self.check_unpickling_error(error, base + b'](}}eb.')
# state = 1-tuple
self.check_unpickling_error(error, base + b'}\x85b.')
# state = 3-tuple
self.check_unpickling_error(error, base + b'}}}\x87b.')
# non-hashable slot name
self.check_unpickling_error(TypeError, base + b'}}]Ns\x86b.')
# non-string slot name
self.check_unpickling_error(TypeError, base + b'}}NNs\x86b.')
# dict = True
self.check_unpickling_error(error, base + b'\x88}\x86b.')
# slots dict = True
self.check_unpickling_error(error, base + b'}\x88\x86b.')

class BadKey1:
count = 1
def __hash__(self):
if not self.count:
raise CustomError
self.count -= 1
return 42
__main__.BadKey1 = BadKey1
# bad hashable dict key
self.check_unpickling_error(CustomError, base + b'}c__main__\nBadKey1\n)\x81Nsb.')

def test_bad_stack(self):
badpickles = [
b'.', # STOP
Expand Down

0 comments on commit 80a8275

Please sign in to comment.