@@ -210,13 +210,24 @@ def test_fuzz(self):
|
210 | 210 | except Exception: |
211 | 211 | pass |
212 | 212 | |
213 | | -def test_loads_2x_code(self): |
214 | | -s = b'c' + (b'X' * 4*4) + b'{' * 2**20 |
215 | | -self.assertRaises(ValueError, marshal.loads, s) |
216 | | - |
217 | 213 | def test_loads_recursion(self): |
218 | | -s = b'c' + (b'X' * 4*5) + b'{' * 2**20 |
219 | | -self.assertRaises(ValueError, marshal.loads, s) |
| 214 | +def run_tests(N, check): |
| 215 | +# (((...None...),),) |
| 216 | +check(b')\x01' * N + b'N') |
| 217 | +check(b'(\x01\x00\x00\x00' * N + b'N') |
| 218 | +# [[[...None...]]] |
| 219 | +check(b'[\x01\x00\x00\x00' * N + b'N') |
| 220 | +# {None: {None: {None: ...None...}}} |
| 221 | +check(b'{N' * N + b'N' + b'0' * N) |
| 222 | +# frozenset([frozenset([frozenset([...None...])])]) |
| 223 | +check(b'>\x01\x00\x00\x00' * N + b'N') |
| 224 | +# Check that the generated marshal data is valid and marshal.loads() |
| 225 | +# works for moderately deep nesting |
| 226 | +run_tests(100, marshal.loads) |
| 227 | +# Very deeply nested structure shouldn't blow the stack |
| 228 | +def check(s): |
| 229 | +self.assertRaises(ValueError, marshal.loads, s) |
| 230 | +run_tests(2**20, check) |
220 | 231 | |
221 | 232 | def test_recursion_limit(self): |
222 | 233 | # Create a deeply nested structure. |
|