Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3e4e72f

Browse files
committed
#4298: pickle.load() can segfault on invalid or truncated input.
Patch and test by Hirokazu Yamamoto.
1 parent 3bae65b commit 3e4e72f

3 files changed

Lines changed: 13 additions & 1 deletion

File tree

Lib/test/pickletester.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,6 +1032,11 @@ def __init__(self): pass
10321032
self.assertRaises(pickle.PicklingError, BadPickler().dump, 0)
10331033
self.assertRaises(pickle.UnpicklingError, BadUnpickler().load)
10341034

1035+
def test_bad_input(self):
1036+
# Test issue4298
1037+
s = bytes([0x58, 0, 0, 0, 0x54])
1038+
self.assertRaises(EOFError, pickle.loads, s)
1039+
10351040

10361041
class AbstractPersistentPicklerTests(unittest.TestCase):
10371042

Misc/NEWS

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ Core and Builtins
1616
Library
1717
-------
1818

19-
- Issue #4283: fix a left-over "iteritems" call in distutils.
19+
- Issue #4298: Fix a segfault when pickle.loads is passed a ill-formed input.
20+
21+
- Issue #4283: Fix a left-over "iteritems" call in distutils.
2022

2123
Build
2224
-----

Modules/_pickle.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,11 @@ unpickler_read(UnpicklerObject *self, char **s, Py_ssize_t n)
489489
return -1;
490490
}
491491

492+
if (PyBytes_GET_SIZE(data) != n) {
493+
PyErr_SetNone(PyExc_EOFError);
494+
return -1;
495+
}
496+
492497
Py_XDECREF(self->last_string);
493498
self->last_string = data;
494499

0 commit comments

Comments
 (0)