[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45482] trunk/blender/source/blender/ makesrna: fix [#30865] Crash when browsing last operators in outliner ( or by Python API)
Campbell Barton
ideasman42 at gmail.com
Mon Apr 9 06:39:47 CEST 2012
Revision: 45482
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45482
Author: campbellbarton
Date: 2012-04-09 04:39:47 +0000 (Mon, 09 Apr 2012)
Log Message:
-----------
fix [#30865] Crash when browsing last operators in outliner (or by Python API)
Operator descriptions can be NULL pointers,
fix this by making use of PROP_NEVER_NULL flag, when its not set, generated string funcs will test for NULL.
Modified Paths:
--------------
trunk/blender/source/blender/makesrna/RNA_types.h
trunk/blender/source/blender/makesrna/intern/makesrna.c
trunk/blender/source/blender/makesrna/intern/rna_define.c
trunk/blender/source/blender/makesrna/intern/rna_ui.c
trunk/blender/source/blender/makesrna/intern/rna_wm.c
Modified: trunk/blender/source/blender/makesrna/RNA_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_types.h 2012-04-09 02:20:26 UTC (rev 45481)
+++ trunk/blender/source/blender/makesrna/RNA_types.h 2012-04-09 04:39:47 UTC (rev 45482)
@@ -180,6 +180,9 @@
/* disallow assigning a variable to its self, eg an object tracking its self
* only apply this to types that are derived from an ID ()*/
PROP_ID_SELF_CHECK = 1<<20,
+ /* use for...
+ * - pointers: in the UI and python so unsetting or setting to None won't work
+ * - strings: so our internal generated get/length/set functions know to do NULL checks before access [#30865] */
PROP_NEVER_NULL = 1<<18,
/* currently only used for UI, this is similar to PROP_NEVER_NULL
* except that the value may be NULL at times, used for ObData, where an Empty's will be NULL
Modified: trunk/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/makesrna.c 2012-04-09 02:20:26 UTC (rev 45481)
+++ trunk/blender/source/blender/makesrna/intern/makesrna.c 2012-04-09 04:39:47 UTC (rev 45482)
@@ -539,6 +539,14 @@
"BLI_strncpy" : "BLI_strncpy_utf8";
rna_print_data_get(f, dp);
+
+ if (!(prop->flag & PROP_NEVER_NULL)) {
+ fprintf(f, " if (data->%s == NULL) {\n", dp->dnaname);
+ fprintf(f, " *value = '\\0';\n");
+ fprintf(f, " return;\n");
+ fprintf(f, " }\n");
+ }
+
if (sprop->maxlength)
fprintf(f, " %s(value, data->%s, %d);\n", string_copy_func, dp->dnaname, sprop->maxlength);
else
@@ -781,6 +789,13 @@
"BLI_strncpy" : "BLI_strncpy_utf8";
rna_print_data_get(f, dp);
+
+ if (!(prop->flag & PROP_NEVER_NULL)) {
+ fprintf(f, " if (data->%s == NULL) {\n", dp->dnaname);
+ fprintf(f, " return;\n");
+ fprintf(f, " }\n");
+ }
+
if (sprop->maxlength)
fprintf(f, " %s(data->%s, value, %d);\n", string_copy_func, dp->dnaname, sprop->maxlength);
else
@@ -956,6 +971,9 @@
}
else {
rna_print_data_get(f, dp);
+ if (!(prop->flag & PROP_NEVER_NULL)) {
+ fprintf(f, " if (data->%s == NULL) return 0;\n", dp->dnaname);
+ }
fprintf(f, " return strlen(data->%s);\n", dp->dnaname);
}
fprintf(f, "}\n\n");
Modified: trunk/blender/source/blender/makesrna/intern/rna_define.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_define.c 2012-04-09 02:20:26 UTC (rev 45481)
+++ trunk/blender/source/blender/makesrna/intern/rna_define.c 2012-04-09 04:39:47 UTC (rev 45482)
@@ -949,7 +949,6 @@
StringPropertyRNA *sprop = (StringPropertyRNA*)prop;
sprop->defaultvalue = "";
- sprop->maxlength = 0;
break;
}
case PROP_ENUM:
@@ -983,6 +982,12 @@
prop->flag |= PROP_ANIMATABLE;
}
+ if (type == PROP_STRING) {
+ /* used so generated 'get/length/set' functions skip a NULL check
+ * in some cases we want it */
+ RNA_def_property_flag(prop, PROP_NEVER_NULL);
+ }
+
if (DefRNA.preprocess) {
switch (type) {
case PROP_BOOLEAN:
Modified: trunk/blender/source/blender/makesrna/intern/rna_ui.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_ui.c 2012-04-09 02:20:26 UTC (rev 45481)
+++ trunk/blender/source/blender/makesrna/intern/rna_ui.c 2012-04-09 04:39:47 UTC (rev 45482)
@@ -840,6 +840,7 @@
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Menu_bl_description_set");
/* RNA_def_property_clear_flag(prop, PROP_EDITABLE); */
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
+ RNA_def_property_clear_flag(prop, PROP_NEVER_NULL); /* check for NULL */
RNA_define_verify_sdna(1);
}
Modified: trunk/blender/source/blender/makesrna/intern/rna_wm.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_wm.c 2012-04-09 02:20:26 UTC (rev 45481)
+++ trunk/blender/source/blender/makesrna/intern/rna_wm.c 2012-04-09 04:39:47 UTC (rev 45482)
@@ -1296,6 +1296,7 @@
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_description_set");
/* RNA_def_property_clear_flag(prop, PROP_EDITABLE); */
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
+ RNA_def_property_clear_flag(prop, PROP_NEVER_NULL); /* check for NULL */
prop = RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type->flag");
@@ -1362,6 +1363,7 @@
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_description_set");
/* RNA_def_property_clear_flag(prop, PROP_EDITABLE); */
RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
+ RNA_def_property_clear_flag(prop, PROP_NEVER_NULL); /* check for NULL */
prop = RNA_def_property(srna, "bl_options", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "type->flag");
More information about the Bf-blender-cvs
mailing list