Improve unpickling errors handling #69947
Copy link
Copy link
Closed
Labels
extension-modulesC modules in the Modules dirC modules in the Modules dirstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytestsTests in the Lib/test dirTests in the Lib/test dirtype-featureA feature request or enhancementA feature request or enhancement
Description
| BPO | 25761 |
|---|---|
| Nosy | @pitrou, @avassalotti, @serhiy-storchaka |
| Files |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee = 'https://github.com/serhiy-storchaka'
closed_at = <Date 2016-09-08.08:07:23.589>
created_at = <Date 2015-11-29.10:59:25.708>
labels = ['extension-modules', 'tests', 'type-feature', 'library']
title = 'Improve unpickling errors handling'
updated_at = <Date 2016-09-08.08:07:23.586>
user = 'https://github.com/serhiy-storchaka'bugs.python.org fields:
activity = <Date 2016-09-08.08:07:23.586>
actor = 'serhiy.storchaka'
assignee = 'serhiy.storchaka'
closed = True
closed_date = <Date 2016-09-08.08:07:23.589>
closer = 'serhiy.storchaka'
components = ['Extension Modules', 'Library (Lib)', 'Tests']
creation = <Date 2015-11-29.10:59:25.708>
creator = 'serhiy.storchaka'
dependencies = []
files = ['41188', '41257']
hgrepos = []
issue_num = 25761
keywords = ['patch']
message_count = 7.0
messages = ['255567', '255569', '255571', '256028', '256032', '256055', '274626']
nosy_count = 4.0
nosy_names = ['pitrou', 'alexandre.vassalotti', 'python-dev', 'serhiy.storchaka']
pr_nums = []
priority = 'normal'
resolution = 'fixed'
stage = 'resolved'
status = 'closed'
superseder = None
type = 'enhancement'
url = 'https://bugs.python.org/issue25761'
versions = ['Python 3.6']Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
extension-modulesC modules in the Modules dirC modules in the Modules dirstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytestsTests in the Lib/test dirTests in the Lib/test dirtype-featureA feature request or enhancementA feature request or enhancement
Activity
serhiy-storchaka commentedon Nov 29, 2015
This issue is for better detecting and reporting errors in broken pickle data.
python-dev commentedon Nov 29, 2015
New changeset d47e5b162072 by Serhiy Storchaka in branch '3.4':
Issue bpo-25761: Added more test cases for testing unpickling broken data.
https://hg.python.org/cpython/rev/d47e5b162072
New changeset c7e7d77ef8bf by Serhiy Storchaka in branch '2.7':
Issue bpo-25761: Added more test cases for testing unpickling broken data.
https://hg.python.org/cpython/rev/c7e7d77ef8bf
New changeset 4897438543da by Serhiy Storchaka in branch '3.5':
Issue bpo-25761: Added more test cases for testing unpickling broken data.
https://hg.python.org/cpython/rev/4897438543da
New changeset c852c7d8d681 by Serhiy Storchaka in branch 'default':
Issue bpo-25761: Added more test cases for testing unpickling broken data.
https://hg.python.org/cpython/rev/c852c7d8d681
serhiy-storchaka commentedon Nov 29, 2015
Proposed patch allows unpickler to detect errors related to reading a stack behind a mark.
For now Python implementation just pops a sentinel used as a mark. This can cause TypeError, AttributeError or UnpicklingError besides IndexError:
Or can silently expose the mark object:
C implementation just ignores incorrect mark:
But in case of complex data this can cause errors later.
With the patch C implementation always raises UnpicklingError with relevant message and Python implementation always raises IndexError.
python-dev commentedon Dec 6, 2015
New changeset 5c670af0100f by Serhiy Storchaka in branch 'default':
Issue bpo-25761: Improved detecting errors in broken pickle data.
https://hg.python.org/cpython/rev/5c670af0100f
serhiy-storchaka commentedon Dec 6, 2015
When pickle stream is unexpectedly ended, different exceptions can be raised. EOFError("Ran out of input") is raised when the stream is unexpectedly ended without the STOP opcode. But it can be raised also when the data for the opcode is incomplete. Other possible exceptions are UnpicklingError, AttributeError and ValueError.
Examples:
Following patch makes C implementation of unpickler always raise UnpicklingError("pickle data was truncated") if the data for the opcode is truncated (above examples). EOFError("Ran out of input") is raised when the stream is unexpectedly ended without the STOP opcode, as before.
I'm not sure, may be always raise UnpicklingError or EOFError? Or change error message?
python-dev commentedon Dec 7, 2015
New changeset 001514146c21 by Serhiy Storchaka in branch 'default':
Issue bpo-25761: Fixed reference leak added in previous changeset (5c670af0100f).
https://hg.python.org/cpython/rev/001514146c21
python-dev commentedon Sep 6, 2016
New changeset 231f578dfd3d by Serhiy Storchaka in branch 'default':
Issue bpo-25761: Improved error reporting about truncated pickle data in
https://hg.python.org/cpython/rev/231f578dfd3d