[Bf-blender-cvs] [ac6be6759ec] blender-v2.83-release: Fix Cycles Python error when device name is not a valid UTF-8 string

Brecht Van Lommel noreply at git.blender.org
Mon May 4 23:29:00 CEST 2020


Commit: ac6be6759ecc6c6503e8785ee405c003e0ca2fe5
Author: Brecht Van Lommel
Date:   Mon May 4 20:02:08 2020 +0200
Branches: blender-v2.83-release
https://developer.blender.org/rBac6be6759ecc6c6503e8785ee405c003e0ca2fe5

Fix Cycles Python error when device name is not a valid UTF-8 string

This may fix or help diagnose T76378.

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

M	intern/cycles/blender/blender_python.cpp

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

diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp
index 89bcebda193..8c7c0bc1daa 100644
--- a/intern/cycles/blender/blender_python.cpp
+++ b/intern/cycles/blender/blender_python.cpp
@@ -60,6 +60,12 @@ void *pylong_as_voidptr_typesafe(PyObject *object)
   return PyLong_AsVoidPtr(object);
 }
 
+PyObject *pyunicode_from_string(const char *str)
+{
+  /* Ignore errors if device API returns invalid UTF-8 strings. */
+  return PyUnicode_DecodeUTF8(str, strlen(str), "ignore");
+}
+
 /* Synchronize debug flags from a given Blender scene.
  * Return truth when device list needs invalidation.
  */
@@ -429,9 +435,9 @@ static PyObject *available_devices_func(PyObject * /*self*/, PyObject *args)
     DeviceInfo &device = devices[i];
     string type_name = Device::string_from_type(device.type);
     PyObject *device_tuple = PyTuple_New(3);
-    PyTuple_SET_ITEM(device_tuple, 0, PyUnicode_FromString(device.description.c_str()));
-    PyTuple_SET_ITEM(device_tuple, 1, PyUnicode_FromString(type_name.c_str()));
-    PyTuple_SET_ITEM(device_tuple, 2, PyUnicode_FromString(device.id.c_str()));
+    PyTuple_SET_ITEM(device_tuple, 0, pyunicode_from_string(device.description.c_str()));
+    PyTuple_SET_ITEM(device_tuple, 1, pyunicode_from_string(type_name.c_str()));
+    PyTuple_SET_ITEM(device_tuple, 2, pyunicode_from_string(device.id.c_str()));
     PyTuple_SET_ITEM(ret, i, device_tuple);
   }
 
@@ -642,7 +648,7 @@ static PyObject *osl_compile_func(PyObject * /*self*/, PyObject *args)
 static PyObject *system_info_func(PyObject * /*self*/, PyObject * /*value*/)
 {
   string system_info = Device::device_capabilities();
-  return PyUnicode_FromString(system_info.c_str());
+  return pyunicode_from_string(system_info.c_str());
 }
 
 #ifdef WITH_OPENCL



More information about the Bf-blender-cvs mailing list