Fix T51052: CacheFile Open crashes from Python
authorCampbell Barton <ideasman42@gmail.com>
Mon, 10 Jul 2017 07:06:25 +0000 (17:06 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 10 Jul 2017 07:06:25 +0000 (17:06 +1000)
Note that bpy.data access makes more sense here,
but better not crash when called from Python.

source/blender/editors/io/io_cache.c

index af6f55d7a643b2de593796de22da793a7fb7da58..a5e90ebbe7a1ee302b40ebdaa263b218de1ce7ad 100644 (file)
@@ -97,22 +97,24 @@ static int cachefile_open_exec(bContext *C, wmOperator *op)
        BLI_strncpy(cache_file->filepath, filename, FILE_MAX);
        BKE_cachefile_reload(bmain, cache_file);
 
-       /* hook into UI */
-       PropertyPointerRNA *pprop = op->customdata;
-
-       if (pprop->prop) {
-               /* when creating new ID blocks, use is already 1, but RNA
-                * pointer se also increases user, so this compensates it */
-               id_us_min(&cache_file->id);
-
-               PointerRNA idptr;
-               RNA_id_pointer_create(&cache_file->id, &idptr);
-               RNA_property_pointer_set(&pprop->ptr, pprop->prop, idptr);
-               RNA_property_update(C, &pprop->ptr, pprop->prop);
+       /* Will be set when running invoke, not exec directly. */
+       if (op->customdata != NULL) {
+               /* hook into UI */
+               PropertyPointerRNA *pprop = op->customdata;
+               if (pprop->prop) {
+                       /* when creating new ID blocks, use is already 1, but RNA
+                        * pointer se also increases user, so this compensates it */
+                       id_us_min(&cache_file->id);
+
+                       PointerRNA idptr;
+                       RNA_id_pointer_create(&cache_file->id, &idptr);
+                       RNA_property_pointer_set(&pprop->ptr, pprop->prop, idptr);
+                       RNA_property_update(C, &pprop->ptr, pprop->prop);
+               }
+
+               MEM_freeN(op->customdata);
        }
 
-       MEM_freeN(op->customdata);
-
        return OPERATOR_FINISHED;
 }