diff options
author | Campbell Barton <campbell@blender.org> | 2022-07-07 05:30:40 +0300 |
---|---|---|
committer | Campbell Barton <campbell@blender.org> | 2022-07-07 05:30:40 +0300 |
commit | 378f65f7d9843ea789a66623019163f935af141e (patch) | |
tree | 6862ca2d9b1b5ae78939dda59c2e9db9cb3167eb /source | |
parent | 3354ec3fb3f6c0785c7c1ad9d84bae1c58d1628f (diff) |
Fix Py-driver byte code access with Python 3.11
Error in [0] which assumed the struct member was renamed however
byte-code access from PyCodeObject now requires an API call.
Thanks to @music for pointing this out.
[0]: 780c0ea097444c3be60314dffd203c099720badb
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/python/intern/bpy_driver.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c index f71cf164e8c..07de5877d42 100644 --- a/source/blender/python/intern/bpy_driver.c +++ b/source/blender/python/intern/bpy_driver.c @@ -443,13 +443,19 @@ static bool bpy_driver_secure_bytecode_validate(PyObject *expr_code, PyObject *d PyObject *co_code; # if PY_VERSION_HEX >= 0x030b0000 /* Python 3.11 & newer. */ - co_code = py_code->_co_code; + co_code = PyCode_GetCode(py_code); + if (UNLIKELY(!co_code)) { + PyErr_Print(); + PyErr_Clear(); + return false; + } # else co_code = py_code->co_code; # endif PyBytes_AsStringAndSize(co_code, (char **)&codestr, &code_len); code_len /= sizeof(*codestr); + bool ok = true; for (Py_ssize_t i = 0; i < code_len; i++) { const int opcode = _Py_OPCODE(codestr[i]); @@ -458,11 +464,17 @@ static bool bpy_driver_secure_bytecode_validate(PyObject *expr_code, PyObject *d "\tBPY_driver_eval() - restricted access disallows opcode '%d', " "enable auto-execution to support\n", opcode); - return false; + ok = false; + break; } } -# undef CODESIZE +# if PY_VERSION_HEX >= 0x030b0000 /* Python 3.11 & newer. */ + Py_DECREF(co_code); +# endif + if (!ok) { + return false; + } } return true; |