]> granicus.if.org Git - python/commit
[3.5] bpo-29537: Tolerate legacy invalid bytecode (#169)
authorNick Coghlan <ncoghlan@gmail.com>
Wed, 8 Mar 2017 06:41:01 +0000 (16:41 +1000)
committerGitHub <noreply@github.com>
Wed, 8 Mar 2017 06:41:01 +0000 (16:41 +1000)
commit93602e3af70d3b9f98ae2da654b16b3382b68d50
tree632030f1074215e980a070e718be27d2096ffe88
parentbef209d449afcdc391b108d197a95b15902197d9
[3.5] bpo-29537: Tolerate legacy invalid bytecode (#169)

bpo-27286 fixed a problem where BUILD_MAP_UNPACK_WITH_CALL could
be emitted with an incorrect oparg value, causing the eval loop
to access the wrong stack entry when attempting to read the
function name.

The associated magic number change caused significant problems when
attempting to upgrade to 3.5.3 for anyone that relies on pre-cached
bytecode remaining valid across maintenance releases.

This patch restores the ability to import legacy bytecode generated
by 3.5.0, 3.5.1 or 3.5.2, and modifies the eval loop to
avoid any harmful consequences from the potentially malformed legacy
bytecode.

Original import patch by Petr Viktorin, eval loop patch by Serhiy Storchaka,
and tests and integration by Nick Coghlan.
13 files changed:
Lib/importlib/_bootstrap_external.py
Lib/importlib/util.py
Lib/pkgutil.py
Lib/pydoc.py
Lib/test/test_extcall.py
Lib/test/test_importlib/source/test_file_loader.py
Lib/test/test_unpack_ex.py
Misc/NEWS
Modules/zipimport.c
Python/ceval.c
Python/import.c
Python/importlib_external.h
Python/pythonrun.c