[Bf-blender-cvs] [378f65f7d98] master: Fix Py-driver byte code access with Python 3.11

Campbell Barton noreply at git.blender.org
Thu Jul 7 04:35:22 CEST 2022


Commit: 378f65f7d9843ea789a66623019163f935af141e
Author: Campbell Barton
Date:   Thu Jul 7 12:30:40 2022 +1000
Branches: master
https://developer.blender.org/rB378f65f7d9843ea789a66623019163f935af141e

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

===================================================================

M	source/blender/python/intern/bpy_driver.c

===================================================================

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;



More information about the Bf-blender-cvs mailing list