[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29427] trunk/blender/source/blender: modify my last commit to fix [#22486] add_actuator crashes when name is bigger than 32 chars

Campbell Barton ideasman42 at gmail.com
Sat Jun 12 19:30:24 CEST 2010


Revision: 29427
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29427
Author:   campbellbarton
Date:     2010-06-12 19:30:21 +0200 (Sat, 12 Jun 2010)

Log Message:
-----------
modify my last commit to fix [#22486] add_actuator crashes when name is bigger than 32 chars

Throwing an exception if the strings too long means scripts need to be aware of string lengths and changing a string length in RNA can too easily break scripts.
Instead honor the string length in RNA_property_string_set()

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_idprop.h
    trunk/blender/source/blender/blenkernel/intern/idprop.c
    trunk/blender/source/blender/makesrna/intern/rna_access.c
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/blenkernel/BKE_idprop.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_idprop.h	2010-06-12 15:49:01 UTC (rev 29426)
+++ trunk/blender/source/blender/blenkernel/BKE_idprop.h	2010-06-12 17:30:21 UTC (rev 29427)
@@ -71,7 +71,8 @@
 void IDP_UnlinkArray(struct IDProperty *prop);
 
 /* ---------- String Type ------------ */
-void IDP_AssignString(struct IDProperty *prop, char *st);
+IDProperty *IDP_NewString(const char *st, const char *name, int maxlen);/* maxlen excludes '\0' */
+void IDP_AssignString(struct IDProperty *prop, char *st, int maxlen);	/* maxlen excludes '\0' */
 void IDP_ConcatStringC(struct IDProperty *prop, char *st);
 void IDP_ConcatString(struct IDProperty *str1, struct IDProperty *append);
 void IDP_FreeString(struct IDProperty *prop);

Modified: trunk/blender/source/blender/blenkernel/intern/idprop.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/idprop.c	2010-06-12 15:49:01 UTC (rev 29426)
+++ trunk/blender/source/blender/blenkernel/intern/idprop.c	2010-06-12 17:30:21 UTC (rev 29427)
@@ -299,6 +299,34 @@
 
 
 /* ---------- String Type ------------ */
+IDProperty *IDP_NewString(const char *st, const char *name, int maxlen)
+{
+	IDProperty *prop = MEM_callocN(sizeof(IDProperty), "IDProperty string");
+
+	if (st == NULL) {
+		prop->data.pointer = MEM_callocN(DEFAULT_ALLOC_FOR_NULL_STRINGS, "id property string 1");
+		prop->totallen = DEFAULT_ALLOC_FOR_NULL_STRINGS;
+		prop->len = 1; /*NULL string, has len of 1 to account for null byte.*/
+	}
+	else {
+		int stlen = strlen(st);
+
+		if(maxlen > 0 && maxlen < stlen)
+			stlen = maxlen;
+
+		stlen++; /* null terminator '\0' */
+
+		prop->data.pointer = MEM_callocN(stlen, "id property string 2");
+		prop->len = prop->totallen = stlen;
+		BLI_strncpy(prop->data.pointer, st, stlen);
+	}
+
+	prop->type = IDP_STRING;
+	BLI_strncpy(prop->name, name, MAX_IDPROP_NAME);
+
+	return prop;
+}
+
 IDProperty *IDP_CopyString(IDProperty *prop)
 {
 	IDProperty *newp = idp_generic_copy(prop);
@@ -312,14 +340,19 @@
 }
 
 
-void IDP_AssignString(IDProperty *prop, char *st)
+void IDP_AssignString(IDProperty *prop, char *st, int maxlen)
 {
 	int stlen;
 
 	stlen = strlen(st);
 
-	IDP_ResizeArray(prop, stlen+1); /*make room for null byte :) */
-	strcpy(prop->data.pointer, st);
+	if(maxlen > 0 && maxlen < stlen)
+		stlen= maxlen;
+
+	stlen++; /* make room for null byte */
+
+	IDP_ResizeArray(prop, stlen);
+	BLI_strncpy(prop->data.pointer, st, stlen);
 }
 
 void IDP_ConcatStringC(IDProperty *prop, char *st)
@@ -709,9 +742,6 @@
 	prop->type = type;
 	BLI_strncpy(prop->name, name, MAX_IDPROP_NAME);
 	
-	/*security null byte*/
-	prop->name[MAX_IDPROP_NAME-1] = 0;
-	
 	return prop;
 }
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c	2010-06-12 15:49:01 UTC (rev 29426)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c	2010-06-12 17:30:21 UTC (rev 29427)
@@ -961,7 +961,7 @@
 }
 
 /* this is the max length including \0 terminator.
- * -1 used when their is no maximum */
+ * '0' used when their is no maximum */
 int RNA_property_string_maxlength(PropertyRNA *prop)
 {
 	StringPropertyRNA *sprop= (StringPropertyRNA*)rna_ensure_property(prop);
@@ -1830,18 +1830,15 @@
 	IDProperty *idprop;
 
 	if((idprop=rna_idproperty_check(&prop, ptr)))
-		IDP_AssignString(idprop, (char*)value);
+		IDP_AssignString(idprop, (char*)value, RNA_property_string_maxlength(prop) - 1);
 	else if(sprop->set)
-		sprop->set(ptr, value);
+		sprop->set(ptr, value); /* set function needs to clamp its self */
 	else if(prop->flag & PROP_EDITABLE) {
-		IDPropertyTemplate val = {0};
 		IDProperty *group;
 
-		val.str= (char*)value;
-
 		group= RNA_struct_idproperties(ptr, 1);
 		if(group)
-			IDP_AddToGroup(group, IDP_New(IDP_STRING, val, (char*)prop->identifier));
+			IDP_AddToGroup(group, IDP_NewString((char*)value, (char*)prop->identifier, RNA_property_string_maxlength(prop) - 1));
 	}
 }
 

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2010-06-12 15:49:01 UTC (rev 29426)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2010-06-12 17:30:21 UTC (rev 29427)
@@ -924,16 +924,11 @@
 		}
 		case PROP_STRING:
 		{
-			Py_ssize_t param_len;
-			int param_maxlen= RNA_property_string_maxlength(prop) - 1;
-			char *param = _PyUnicode_AsStringAndSize(value, &param_len);
+			char *param = _PyUnicode_AsString(value);
 
 			if (param==NULL) {
 				PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a string type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
 				return -1;
-			} else if (param_maxlen != -1 && param_len > param_maxlen) { /* -1 because it includes the \0 */
-				PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s string is length %d, expected maximum of %d", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), (int)param_len, param_maxlen);
-				return -1;
 			}
 			else {
 				if(data)	*((char**)data)= param;





More information about the Bf-blender-cvs mailing list