https://github.com/python/cpython/commit/addb225f3823b03774cddacce35214dd471bec46
commit: addb225f3823b03774cddacce35214dd471bec46
branch: main
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2024-11-20T17:31:50+02:00
summary:
gh-126991: Add tests for unpickling bad object state (GH-127031)
This catches a memory leak in loading the BUILD opcode.
files:
M Lib/test/pickletester.py
diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py
index 8ef8fae44f1d25..cf020a48b81cfa 100644
--- a/Lib/test/pickletester.py
+++ b/Lib/test/pickletester.py
@@ -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
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]