Skip to content

Commit d708639

Browse files
committed
unpickler: guard against UnicodeEncodeError when restoring base64/85
1 parent 7db7dd4 commit d708639

File tree

3 files changed

+7
-4
lines changed

3 files changed

+7
-4
lines changed

CHANGES.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ Upcoming
22
========
33
* The unpickler is now more resilient to malformed "py/id" and "py/repr" data.
44
(+546)
5+
* The unpickler is now more resilient to invalid "py/b85" and "py/b64" data.
56

67
v4.0.1
78
======

jsonpickle/unpickler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -445,13 +445,13 @@ def register_classes(self, classes):
445445
def _restore_base64(self, obj):
446446
try:
447447
return util.b64decode(obj[tags.B64].encode('utf-8'))
448-
except AttributeError:
448+
except (AttributeError, UnicodeEncodeError):
449449
return b''
450450

451451
def _restore_base85(self, obj):
452452
try:
453453
return util.b85decode(obj[tags.B85].encode('utf-8'))
454-
except AttributeError:
454+
except (AttributeError, UnicodeEncodeError):
455455
return b''
456456

457457
def _refname(self):

tests/jsonpickle_test.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ def test_decode_base85(unpickler):
217217
assert unpickler.restore(pickled) == expected
218218

219219

220-
@pytest.mark.parametrize('value', ['', '/', 1, True, False, None, [], {}])
220+
@pytest.mark.parametrize('value', ['', '/', '\udc00', 1, True, False, None, [], {}])
221221
def test_decode_invalid_b85(value, unpickler):
222222
"""Invalid base85 data restores to an empty string"""
223223
expected = b''
@@ -232,7 +232,9 @@ def test_base85_still_handles_base64(unpickler):
232232
assert unpickler.restore(pickled) == expected
233233

234234

235-
@pytest.mark.parametrize('value', ['', 'x', '!', 0, 1, True, False, None, [], {}])
235+
@pytest.mark.parametrize(
236+
'value', ['', 'x', '!', '\udc00', 0, 1, True, False, None, [], {}]
237+
)
236238
def test_decode_invalid_b64(value, unpickler):
237239
"""Invalid base85 data restores to an empty string"""
238240
expected = b''

0 commit comments

Comments
 (0)