[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