[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35547] trunk/blender: fix/disallow [ #26502] segmentationfault on pressing button to browse existing images for UV window

Campbell Barton ideasman42 at gmail.com
Tue Mar 15 00:02:48 CET 2011


Revision: 35547
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35547
Author:   campbellbarton
Date:     2011-03-14 23:02:47 +0000 (Mon, 14 Mar 2011)
Log Message:
-----------
fix/disallow [#26502] segmentationfault on pressing button to browse existing images for UV window

creating RNA within draw functions can free existing RNA, crashing blender when this is already used in the UI.
disallowing this so it raises a python exception.

This was being used to dynamically generate addon categories so for now they are hard coded and we need proper enum-functions for python to do this. 

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_userpref.py
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/release/scripts/ui/space_userpref.py
===================================================================
--- trunk/blender/release/scripts/ui/space_userpref.py	2011-03-14 22:16:35 UTC (rev 35546)
+++ trunk/blender/release/scripts/ui/space_userpref.py	2011-03-14 23:02:47 UTC (rev 35547)
@@ -853,8 +853,8 @@
     bl_region_type = 'WINDOW'
     bl_options = {'HIDE_HEADER'}
 
-    _addons_cats = None
-    _addons_sups = None
+    # _addons_cats = None
+    # _addons_sups = None
     _addons_fake_modules = {}
 
     @classmethod
@@ -875,6 +875,8 @@
         # collect the categories that can be filtered on
         addons = [(mod, addon_utils.module_bl_info(mod)) for mod in addon_utils.modules(USERPREF_PT_addons._addons_fake_modules)]
 
+        # XXX. we need dynamic enums to properly support this.
+        """
         cats = {info["category"] for mod, info in addons}
         cats.discard("")
 
@@ -882,6 +884,8 @@
             bpy.types.WindowManager.addon_filter = EnumProperty(items=[(cat, cat, "") for cat in ["All", "Enabled", "Disabled"] + sorted(cats)], name="Category", description="Filter add-ons by category")
             bpy.types.WindowManager.addon_search = StringProperty(name="Search", description="Search within the selected filter")
             USERPREF_PT_addons._addons_cats = cats
+            
+            [('All', 'All', ''), ('Enabled', 'Enabled', ''), ('Disabled', 'Disabled', ''), ('3D View', '3D View', ''), ('Add Curve', 'Add Curve', ''), ('Add Mesh', 'Add Mesh', ''), ('Animation', 'Animation', ''), ('Development', 'Development', ''), ('Game Engine', 'Game Engine', ''), ('Import-Export', 'Import-Export', ''), ('Mesh', 'Mesh', ''), ('Object', 'Object', ''), ('Render', 'Render', ''), ('Rigging', 'Rigging', ''), ('System', 'System', '')]
 
         sups_default = {'OFFICIAL', 'COMMUNITY'}
         sups = sups_default | {info["support"] for mod, info in addons}
@@ -890,6 +894,7 @@
         if USERPREF_PT_addons._addons_sups != sups:
             bpy.types.WindowManager.addon_support = EnumProperty(items=[(sup, sup.title(), "") for  sup in reversed(sorted(sups))], name="Support", description="Display support level", default=sups_default, options={'ENUM_FLAG'})
             USERPREF_PT_addons._addons_sups = sups
+        """
 
         split = layout.split(percentage=0.2)
         col = split.column()
@@ -1193,7 +1198,38 @@
 def register():
     bpy.utils.register_module(__name__)
 
+    WindowManager = bpy.types.WindowManager
 
+    WindowManager.addon_search = StringProperty(name="Search", description="Search within the selected filter")
+    WindowManager.addon_filter = EnumProperty(
+            items=[('All', "All", ""),
+                   ('Enabled', "Enabled", ""),
+                   ('Disabled', "Disabled", ""),
+                   ('3D View', "3D View", ""),
+                   ('Add Curve', "Add Curve", ""),
+                   ('Add Mesh', "Add Mesh", ""),
+                   ('Animation', "Animation", ""),
+                   ('Development', "Development", ""),
+                   ('Game Engine', "Game Engine", ""),
+                   ('Import-Export', "Import-Export", ""),
+                   ('Mesh', "Mesh", ""),
+                   ('Object', "Object", ""),
+                   ('Render', "Render", ""),
+                   ('Rigging', "Rigging", ""),
+                   ('System', "System", "") 
+                   ], 
+            name="Category",
+            description="Filter add-ons by category",
+            )
+
+    WindowManager.addon_support = EnumProperty(
+            items=[('OFFICIAL', "Official", ""),
+                   ('COMMUNITY', 'Community', ""),
+                  ],
+            name="Support",
+            description="Display support level", default={'OFFICIAL', 'COMMUNITY'}, options={'ENUM_FLAG'})
+
+
 def unregister():
     bpy.utils.unregister_module(__name__)
 

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2011-03-14 22:16:35 UTC (rev 35546)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2011-03-14 23:02:47 UTC (rev 35547)
@@ -2967,9 +2967,15 @@
 static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyObject *value)
 {
 	StructRNA *srna= srna_from_self(cls, "StructRNA.__setattr__");
+	const int is_deferred_prop= pyrna_is_deferred_prop(value);
 
+	if(srna && !pyrna_write_check() && (is_deferred_prop || RNA_struct_type_find_property(srna, _PyUnicode_AsString(attr)))) {
+		PyErr_Format(PyExc_AttributeError, "pyrna_struct_meta_idprop_setattro() can't set in readonly state '%.200s.%S'", ((PyTypeObject *)cls)->tp_name, attr);
+		return -1;
+	}
+
 	if(srna == NULL) {
-		if(value && pyrna_is_deferred_prop(value)) {
+		if(value && is_deferred_prop) {
 			PyErr_Format(PyExc_AttributeError, "pyrna_struct_meta_idprop_setattro() unable to get srna from class '%.200s'", ((PyTypeObject *)cls)->tp_name);
 			return -1;
 		}
@@ -2981,7 +2987,7 @@
 
 	if(value) {
 		/* check if the value is a property */
-		if(pyrna_is_deferred_prop(value)) {
+		if(is_deferred_prop) {
 			int ret= deferred_register_prop(srna, attr, value);
 			if(ret == -1) {
 				/* error set */




More information about the Bf-blender-cvs mailing list