mirror of
https://github.com/python/cpython.git
synced 2026-01-06 15:32:22 +00:00
gh-135241: Make unpickling of booleans in protocol 0 more strict (GH-135242)
The Python pickle module looks for "00" and "01" but _pickle only looked for 2 characters that parsed to 0 or 1, meaning some payloads like "+0" or " 0" would lead to different results in different implementations.
This commit is contained in:
parent
0cbbfc4621
commit
781294019d
3 changed files with 14 additions and 1 deletions
|
|
@ -1012,6 +1012,16 @@ def test_constants(self):
|
|||
self.assertIs(self.loads(b'I01\n.'), True)
|
||||
self.assertIs(self.loads(b'I00\n.'), False)
|
||||
|
||||
def test_issue135241(self):
|
||||
# C implementation should check for hardcoded values 00 and 01
|
||||
# when getting booleans from the INT opcode. Doing a str comparison
|
||||
# to bypass truthy/falsy comparisons. These payloads should return
|
||||
# 0, not False.
|
||||
out1 = self.loads(b'I+0\n.')
|
||||
self.assertEqual(str(out1), '0')
|
||||
out2 = self.loads(b'I 0\n.')
|
||||
self.assertEqual(str(out2), '0')
|
||||
|
||||
def test_zero_padded_integers(self):
|
||||
self.assertEqual(self.loads(b'I010\n.'), 10)
|
||||
self.assertEqual(self.loads(b'I-010\n.'), -10)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
The :code:`INT` opcode of the C accelerator :mod:`!_pickle` module was updated
|
||||
to look only for "00" and "01" to push booleans onto the stack, aligning with
|
||||
the Python :mod:`pickle` module.
|
||||
|
|
@ -5255,7 +5255,7 @@ load_int(PickleState *state, UnpicklerObject *self)
|
|||
}
|
||||
}
|
||||
else {
|
||||
if (len == 3 && (x == 0 || x == 1)) {
|
||||
if (len == 3 && s[0] == '0' && (s[1] == '0' || s[1] == '1')) {
|
||||
if ((value = PyBool_FromLong(x)) == NULL)
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue