[Bf-blender-cvs] [a8ed914] master: Fix crash in some cases when deleting particle systems.

Bastien Montagne noreply at git.blender.org
Thu Sep 15 11:52:40 CEST 2016


Commit: a8ed9144a38980cb4e9a28af70b3b3b34a48e92f
Author: Bastien Montagne
Date:   Thu Sep 15 11:50:56 2016 +0200
Branches: master
https://developer.blender.org/rBa8ed9144a38980cb4e9a28af70b3b3b34a48e92f

Fix crash in some cases when deleting particle systems.

Those 'never null' ID pointers are really a PITA to handle... luckily we don't have much of those around!

Found by Sybren, thanks.

Should be backported to 2.78.

===================================================================

M	source/blender/blenkernel/BKE_library_remap.h
M	source/blender/blenkernel/intern/particle.c
M	source/blender/blenkernel/intern/particle_system.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_library_remap.h b/source/blender/blenkernel/BKE_library_remap.h
index e974b79..89b0870 100644
--- a/source/blender/blenkernel/BKE_library_remap.h
+++ b/source/blender/blenkernel/BKE_library_remap.h
@@ -44,7 +44,7 @@ enum {
 	 * (like e.g. Object->data). */
 	ID_REMAP_FLAG_NEVER_NULL_USAGE  = 1 << 2,
 	/* This tells the callback func to force setting IDs using target one with a 'never NULL' pointer to NULL.
-	 * WARNING! Use with extreme care, this will leave database in broken state! */
+	 * WARNING! Use with extreme care, this will leave database in broken state and can cause crashes very easily! */
 	ID_REMAP_FORCE_NEVER_NULL_USAGE = 1 << 3,
 };
 
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 907721b..1ea2755 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -503,7 +503,9 @@ void psys_free_particles(ParticleSystem *psys)
 	PARTICLE_P;
 
 	if (psys->particles) {
-		if (psys->part->type == PART_HAIR) {
+		/* Even though psys->part should never be NULL, this can happen as an exception during deletion.
+		 * See ID_REMAP_SKIP/FORCE/FLAG_NEVER_NULL_USAGE in BKE_library_remap. */
+		if (psys->part && psys->part->type == PART_HAIR) {
 			LOOP_PARTICLES {
 				if (pa->hair)
 					MEM_freeN(pa->hair);
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index b4e951c..efaf1f9 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -4336,7 +4336,9 @@ void BKE_particlesystem_id_loop(ParticleSystem *psys, ParticleSystemIDFunc func,
 		func(psys, (ID **)&pt->ob, userdata, IDWALK_NOP);
 	}
 
-	if (psys->part->phystype == PART_PHYS_BOIDS) {
+	/* Even though psys->part should never be NULL, this can happen as an exception during deletion.
+	 * See ID_REMAP_SKIP/FORCE/FLAG_NEVER_NULL_USAGE in BKE_library_remap. */
+	if (psys->part && psys->part->phystype == PART_PHYS_BOIDS) {
 		ParticleData *pa;
 		int p;




More information about the Bf-blender-cvs mailing list