diff --git a/Lib/pickle.py b/Lib/pickle.py index 729c215514ad24..42a425ee2d4d38 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -1322,12 +1322,17 @@ def load(self): if not key: raise EOFError assert isinstance(key, bytes_types) - dispatch[key[0]](self) + try: + dispatch[key[0]](self) + except: + raise UnpicklingError(f"invalid load key, '\\x{key[0]:02x}'.") except _Stop as stopinst: return stopinst.value # Return a list of items pushed in the stack after last MARK instruction. def pop_mark(self): + if not self.metastack: + raise UnpicklingError("could not find MARK") items = self.stack self.stack = self.metastack.pop() self.append = self.stack.append diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py index e2384b33345a45..4fc0e79ccd8c2d 100644 --- a/Lib/test/test_pickle.py +++ b/Lib/test/test_pickle.py @@ -55,7 +55,7 @@ class PyPickleTests(AbstractPickleModuleTests, unittest.TestCase): class PyUnpicklerTests(AbstractUnpickleTests, unittest.TestCase): unpickler = pickle._Unpickler - bad_stack_errors = (IndexError,) + bad_stack_errors = (IndexError, pickle.UnpicklingError) truncated_errors = (pickle.UnpicklingError, EOFError, AttributeError, ValueError, struct.error, IndexError, ImportError) diff --git a/Misc/NEWS.d/next/Library/2025-11-19-14-35-36.gh-issue-141749.s86RHS.rst b/Misc/NEWS.d/next/Library/2025-11-19-14-35-36.gh-issue-141749.s86RHS.rst new file mode 100644 index 00000000000000..60655a31bee009 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-19-14-35-36.gh-issue-141749.s86RHS.rst @@ -0,0 +1 @@ +Fixed incorrect exception types occurring in the CPython Unpickler implementation when loading invalid pickle data. In some cases, the CPython fallback raised internal KeyError and IndexError exceptions instead of UnpicklingError.