Page MenuHome

Blender crash when using collection user_id remapping (python)
Closed, ResolvedPublicBUG

Description

System Information
Operating system: Linux-5.8.16-2-MANJARO-x86_64-with-arch-Manjaro-Linux 64 Bits
Graphics card: GeForce GTX 1660 SUPER/PCIe/SSE2 NVIDIA Corporation 4.5.0 NVIDIA 440.100

Blender Version
Broken: version: 2.91.0 Beta, branch: master, commit date: 2020-10-23 17:33, hash: `rB70cc0d7121aa;
Wont work in 2.83 and 2.90 too
Worked: 2.82a
Caused by rB37e08e526c6f: Depsgraph: Add IDProperties handling.

Short description of error
Python script from attached blend file crashes Blender with error:

  • /snap/blender/47/./blender-wrapper: linie 19: 37036 Naruszenie ochrony pamięci (somthing about memory override error) (zrzut pamięci) $SNAP/blender "$@"

What the script does is:

  • add and assign custom PropertyGroup property to bpy.types.Collections
  • create new collection that is used for user remapping of existing collection 'cube_coll'.
  • if we assign some parameter to new PropertyGroup Parameter blender will crash

Script wont crash if we comment out new property assignment, or user remapping.

The script:

import bpy

class CollectionsSettings(bpy.types.PropertyGroup):
    parent: bpy.props.PointerProperty(name="parent", type=bpy.types.Collection)
    
bpy.utils.register_class(CollectionsSettings)

bpy.types.Collection.prop = bpy.props.PointerProperty(type=CollectionsSettings)

# 4 lines below gives crash
cube_col = bpy.data.collections['Cube_coll']
new_col = bpy.data.collections.new('new_col')
new_col.prop.parent = cube_col

cube_col.id_data.user_remap(new_col)

Exact steps for others to reproduce the error
Just execute script from text editor to see the crash.

Event Timeline

Philipp Oeser (lichtwerk) changed the task status from Needs Triage to Confirmed.Oct 27 2020, 5:02 PM
Philipp Oeser (lichtwerk) changed the subtype of this task from "Report" to "Bug".

Can confirm, caused by rB37e08e526c6f: Depsgraph: Add IDProperties handling.

This is only the case if you remap to the same id that holds the property -- and in that case, looks like this enters infinite recursion

1   IDP_foreach_property                                       idprop.c                 1145 0x31b3297 
2   blender::deg::DepsgraphRelationBuilder::build_idproperties deg_builder_relations.cc 578  0xa34c6eb 
3   blender::deg::DepsgraphRelationBuilder::build_collection   deg_builder_relations.cc 594  0xa34c751 
4   blender::deg::DepsgraphRelationBuilder::build_id           deg_builder_relations.cc 497  0xa34c35e 
5   blender::deg::build_idproperties_callback                  deg_builder_relations.cc 573  0xa34c6b9 
6   IDP_foreach_property                                       idprop.c                 1151 0x31b32e6 
7   IDP_foreach_property                                       idprop.c                 1158 0x31b3325 
8   IDP_foreach_property                                       idprop.c                 1158 0x31b3325 
9   blender::deg::DepsgraphRelationBuilder::build_idproperties deg_builder_relations.cc 578  0xa34c6eb 
10  blender::deg::DepsgraphRelationBuilder::build_collection   deg_builder_relations.cc 594  0xa34c751 
11  blender::deg::DepsgraphRelationBuilder::build_id           deg_builder_relations.cc 497  0xa34c35e 
12  blender::deg::build_idproperties_callback                  deg_builder_relations.cc 573  0xa34c6b9 
13  IDP_foreach_property                                       idprop.c                 1151 0x31b32e6 
14  IDP_foreach_property                                       idprop.c                 1158 0x31b3325 
15  IDP_foreach_property                                       idprop.c                 1158 0x31b3325 
16  blender::deg::DepsgraphRelationBuilder::build_idproperties deg_builder_relations.cc 578  0xa34c6eb 
17  blender::deg::DepsgraphRelationBuilder::build_collection   deg_builder_relations.cc 594  0xa34c751 
18  blender::deg::DepsgraphRelationBuilder::build_id           deg_builder_relations.cc 497  0xa34c35e 
19  blender::deg::build_idproperties_callback                  deg_builder_relations.cc 573  0xa34c6b9 
20  IDP_foreach_property                                       idprop.c                 1151 0x31b32e6 
... <More>

So if you remap to something else, no crash occurs

import bpy

class CollectionsSettings(bpy.types.PropertyGroup):
    parent: bpy.props.PointerProperty(name="parent", type=bpy.types.Collection)
    
bpy.utils.register_class(CollectionsSettings)

bpy.types.Collection.prop = bpy.props.PointerProperty(type=CollectionsSettings)

# no crash
cube_col = bpy.data.collections['Cube_coll']
new_col = bpy.data.collections.new('new_col')
third_col = bpy.data.collections.new('third_col')
new_col.prop.parent = cube_col

cube_col.id_data.user_remap(third_col)

Thx @Philipp Oeser (lichtwerk) I may simplified the script too much, but you are right. If I remap 'cube_col' first, then point cube_col to new_col we get no crash (no loop pointer to itself)
However in a bit more complicated case it will still crash:

import bpy

class CollectionsSettings(bpy.types.PropertyGroup):
    parent: bpy.props.PointerProperty(name="parent", type=bpy.types.Collection)
bpy.utils.register_class(CollectionsSettings)

bpy.types.Collection.prop = bpy.props.PointerProperty(type=CollectionsSettings)

# 4 lines below gives crash
cube_col = bpy.data.collections['Cube_coll']
new_col = bpy.data.collections.new('new_col')
cube_col.id_data.user_remap(new_col)                              # remap first so no cyclip loop
new_col.prop.parent = cube_col            # A points to B
cube_col.prop.parent = new_col            # B points to A

I guess you may say there is still loop
new_col points to cube_col ; then cube_col points back to new_col; etc
It worked it 2.82 though. IMO blender could/should check for loop like those.

Bastien Montagne (mont29) triaged this task as High priority.
Bastien Montagne (mont29) edited projects, added BF Blender (2.91); removed BF Blender.
Bastien Montagne (mont29) moved this task from Backlog to bcon3: Bugs on the BF Blender (2.91) board.