Raise an exception when registering classes with ID names which are too long. (relate...
authorCampbell Barton <ideasman42@gmail.com>
Mon, 24 Jan 2011 03:38:34 +0000 (03:38 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 24 Jan 2011 03:38:34 +0000 (03:38 +0000)
source/blender/makesrna/RNA_types.h
source/blender/makesrna/intern/rna_animation.c
source/blender/makesrna/intern/rna_render.c
source/blender/makesrna/intern/rna_ui.c
source/blender/makesrna/intern/rna_wm.c
source/blender/python/intern/bpy_rna.c

index d2faa0d291d1cd13632ad1d6d063cfbcfd97be03..59c81231afea924a8cccb4cc93effe5f1853574c 100644 (file)
@@ -187,6 +187,12 @@ typedef enum PropertyFlag {
         * most common case is functions that return arrays where the array */
        PROP_THICK_WRAP = 1<<23,
 
+       /* Reject values outside limits, use for python api only so far
+        * this is for use when silently clamping string length will give
+        * bad behavior later. Could also enforce this for INT's and other types.
+        * note: currently no support for function arguments or non utf8 paths (filepaths) */
+       PROP_NEVER_CLAMP = 1<<26,
+
        /* internal flags */
        PROP_BUILTIN = 1<<7,
        PROP_EXPORT = 1<<8,
index a28017e50f6c469f326aba746c6849d53cec5eb5..9bed1b5cd5ae00071feb41fb4012aeee0c22e17c 100644 (file)
@@ -458,7 +458,7 @@ static void rna_def_keyingset_info(BlenderRNA *brna)
                
        prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "idname");
-       RNA_def_property_flag(prop, PROP_REGISTER);
+       RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
                
        /* Name */
        prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
index 5d1fc51a70f6b131137e66a855c46c1fc03bc4c0..6344ddca06e3506c9d322e44de8bd3912de222f1 100644 (file)
@@ -271,7 +271,7 @@ static void rna_def_render_engine(BlenderRNA *brna)
 
        prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "type->idname");
-       RNA_def_property_flag(prop, PROP_REGISTER);
+       RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
 
        prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "type->name");
index 183c9aea5e27190e1423b7bde35a09c7b8e9f63b..35186b919019284ecb078dd8ec6a3c91a9e5cb9d 100644 (file)
@@ -646,7 +646,7 @@ static void rna_def_panel(BlenderRNA *brna)
        /* registration */
        prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "type->idname");
-       RNA_def_property_flag(prop, PROP_REGISTER);
+       RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
        RNA_def_property_ui_text(prop, "ID Name", "If this is set, the panel gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is \"OBJECT_PT_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_PT_hello\"");
        
        prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
@@ -708,7 +708,7 @@ static void rna_def_header(BlenderRNA *brna)
        /* registration */
        prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "type->idname");
-       RNA_def_property_flag(prop, PROP_REGISTER);
+       RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
        RNA_def_property_ui_text(prop, "ID Name", "If this is set, the header gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is \"OBJECT_HT_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_HT_hello\"");
 
        prop= RNA_def_property(srna, "bl_space_type", PROP_ENUM, PROP_NONE);
@@ -758,7 +758,7 @@ static void rna_def_menu(BlenderRNA *brna)
        /* registration */
        prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "type->idname");
-       RNA_def_property_flag(prop, PROP_REGISTER);
+       RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
        RNA_def_property_ui_text(prop, "ID Name", "If this is set, the menu gets a custom ID, otherwise it takes the name of the class used to define the panel. For example, if the class name is \"OBJECT_MT_hello\", and bl_idname is not set by the script, then bl_idname = \"OBJECT_MT_hello\"");
 
        prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
index a7870243afc756c1951ae9109b7d01c8f50ced00..6ef173113fd6ccdadccb9ba1439cc7cb70abcec5 100644 (file)
@@ -867,6 +867,14 @@ static StructRNA *rna_Operator_register(bContext *C, ReportList *reports, void *
                return NULL;
        }
 
+       /* sanity check on name
+        * foo.bar */
+//     {
+//             char *ch;
+//             for(ch=identifier)
+
+//     }
+
        /* check if we have registered this operator type before, and remove it */
        {
                wmOperatorType *ot= WM_operatortype_find(dummyot.idname, TRUE);
@@ -1121,10 +1129,10 @@ static void rna_def_operator(BlenderRNA *brna)
        /* Registration */
        prop= RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "type->idname");
-       RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME); /* else it uses the pointer size! */
+       RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME-3); /* else it uses the pointer size!. -3 because '.' -> '_OT_' */
        RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_idname_set");
        // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-       RNA_def_property_flag(prop, PROP_REGISTER);
+       RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
        RNA_def_struct_name_property(srna, prop);
 
        prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
@@ -1185,7 +1193,7 @@ static void rna_def_macro_operator(BlenderRNA *brna)
        RNA_def_property_string_maxlength(prop, OP_MAX_TYPENAME); /* else it uses the pointer size! */
        RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Operator_bl_idname_set");
        // RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-       RNA_def_property_flag(prop, PROP_REGISTER);
+       RNA_def_property_flag(prop, PROP_REGISTER|PROP_NEVER_CLAMP);
        RNA_def_struct_name_property(srna, prop);
 
        prop= RNA_def_property(srna, "bl_label", PROP_STRING, PROP_NONE);
index 8f745bc2756fc6faa3a4a779037795970a013745..e75d898d3aa151258369c1e076d83178b6061acb 100644 (file)
@@ -1071,17 +1071,19 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
                case PROP_STRING:
                {
                        const char *param;
+                       Py_ssize_t param_size= 0;
 #ifdef USE_STRING_COERCE
                        PyObject *value_coerce= NULL;
                        int subtype= RNA_property_subtype(prop);
                        if(ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
+                               /* TODO, get size */
                                param= PyC_UnicodeAsByte(value, &value_coerce);
                        }
                        else {
-                               param= _PyUnicode_AsString(value);
+                               param= _PyUnicode_AsStringAndSize(value, &param_size);
                        }
 #else // USE_STRING_COERCE
-                       param= _PyUnicode_AsString(value);
+                       param= _PyUnicode_AsStringAndSize(value, &param_size);
 #endif // USE_STRING_COERCE
 
                        if (param==NULL) {
@@ -1090,7 +1092,19 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
                        }
                        else {
                                if(data)        *((char**)data)= (char *)param; /*XXX, this is suspect but needed for function calls, need to see if theres a better way */
-                               else            RNA_property_string_set(ptr, prop, param);
+                               else {
+                                       if(RNA_property_flag(prop) & PROP_NEVER_CLAMP) {
+                                               int param_size_max= RNA_property_string_maxlength(prop);
+                                               if(param_size > param_size_max) {
+                                                       PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s only supports a string of length %d, found %d", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), param_size, param_size_max);
+                                                       return -1;
+                                               }
+#ifdef USE_STRING_COERCE
+                                               Py_XDECREF(value_coerce);
+#endif // USE_STRING_COERCE
+                                       }
+                                       RNA_property_string_set(ptr, prop, param);
+                               }
                        }
 #ifdef USE_STRING_COERCE
                        Py_XDECREF(value_coerce);