[Bf-blender-cvs] [40638e19700] blender2.8: Fix T55062: crash with workspace scene relations.

Brecht Van Lommel noreply at git.blender.org
Fri May 25 15:06:48 CEST 2018


Commit: 40638e197004bfe843fa90694bfb3282dd37bdd4
Author: Brecht Van Lommel
Date:   Fri May 25 14:54:55 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB40638e197004bfe843fa90694bfb3282dd37bdd4

Fix T55062: crash with workspace scene relations.

List of relations was saved with wrong struct type.

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

M	source/blender/blenkernel/intern/library_query.c
M	source/blender/blenkernel/intern/workspace.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/makesdna/DNA_workspace_types.h

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

diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c
index f5a6f539381..37b5b62b06e 100644
--- a/source/blender/blenkernel/intern/library_query.c
+++ b/source/blender/blenkernel/intern/library_query.c
@@ -932,7 +932,7 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call
 					BKE_workspace_layout_screen_set(layout, screen);
 				}
 
-				for (WorkSpaceSceneRelation *relation = workspace->scene_relations.first; relation; relation = relation->next) {
+				for (WorkSpaceSceneRelation *relation = workspace->scene_layer_relations.first; relation; relation = relation->next) {
 					CALLBACK_INVOKE(relation->scene, IDWALK_CB_NOP);
 				}
 				break;
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index 73b1defe8e6..c7fb8e18c3e 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -157,7 +157,7 @@ WorkSpace *BKE_workspace_add(Main *bmain, const char *name)
 void BKE_workspace_free(WorkSpace *workspace)
 {
 	BKE_workspace_relations_free(&workspace->hook_layout_relations);
-	BLI_freelistN(&workspace->scene_relations);
+	BLI_freelistN(&workspace->scene_layer_relations);
 
 	BLI_freelistN(&workspace->owner_ids);
 	BLI_freelistN(&workspace->layouts);
@@ -261,14 +261,14 @@ void BKE_workspace_relations_free(
 void BKE_workspace_scene_relations_free_invalid(
         WorkSpace *workspace)
 {
-	for (WorkSpaceSceneRelation *relation = workspace->scene_relations.first, *relation_next; relation; relation = relation_next) {
+	for (WorkSpaceSceneRelation *relation = workspace->scene_layer_relations.first, *relation_next; relation; relation = relation_next) {
 		relation_next = relation->next;
 
 		if (relation->scene == NULL) {
-			BLI_freelinkN(&workspace->scene_relations, relation);
+			BLI_freelinkN(&workspace->scene_layer_relations, relation);
 		}
 		else if (!BLI_findstring(&relation->scene->view_layers, relation->view_layer, offsetof(ViewLayer, name))) {
-			BLI_freelinkN(&workspace->scene_relations, relation);
+			BLI_freelinkN(&workspace->scene_layer_relations, relation);
 		}
 	}
 }
@@ -283,7 +283,7 @@ void BKE_workspace_view_layer_rename(
         const char *new_name)
 {
 	for (WorkSpace *workspace = bmain->workspaces.first; workspace; workspace = workspace->id.next) {
-		for (WorkSpaceSceneRelation *relation = workspace->scene_relations.first; relation; relation = relation->next) {
+		for (WorkSpaceSceneRelation *relation = workspace->scene_layer_relations.first; relation; relation = relation->next) {
 			if (relation->scene == scene && STREQ(relation->view_layer, old_name)) {
 				STRNCPY(relation->view_layer, new_name);
 			}
@@ -428,7 +428,7 @@ Base *BKE_workspace_active_base_get(const WorkSpace *workspace, const Scene *sce
 
 ViewLayer *BKE_workspace_view_layer_exists(const WorkSpace *workspace, const Scene *scene)
 {
-	WorkSpaceSceneRelation *relation = BLI_findptr(&workspace->scene_relations, scene, offsetof(WorkSpaceSceneRelation, scene));
+	WorkSpaceSceneRelation *relation = BLI_findptr(&workspace->scene_layer_relations, scene, offsetof(WorkSpaceSceneRelation, scene));
 	return (relation) ? BLI_findstring(&scene->view_layers, relation->view_layer, offsetof(ViewLayer, name)) : NULL;
 }
 
@@ -446,18 +446,18 @@ ViewLayer *BKE_workspace_view_layer_get(const WorkSpace *workspace, const Scene
 
 void BKE_workspace_view_layer_set(WorkSpace *workspace, ViewLayer *layer, Scene *scene)
 {
-	WorkSpaceSceneRelation *relation = BLI_findptr(&workspace->scene_relations, scene, offsetof(WorkSpaceSceneRelation, scene));
+	WorkSpaceSceneRelation *relation = BLI_findptr(&workspace->scene_layer_relations, scene, offsetof(WorkSpaceSceneRelation, scene));
 	if (relation == NULL) {
 		relation = MEM_callocN(sizeof(*relation), __func__);
 	}
 	else {
-		BLI_remlink(&workspace->scene_relations, relation);
+		BLI_remlink(&workspace->scene_layer_relations, relation);
 	}
 
 	/* (Re)insert at the head of the list, for faster lookups. */
 	relation->scene = scene;
 	STRNCPY(relation->view_layer, layer->name);
-	BLI_addhead(&workspace->scene_relations, relation);
+	BLI_addhead(&workspace->scene_layer_relations, relation);
 }
 
 ListBase *BKE_workspace_layouts_get(WorkSpace *workspace)
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index ce48d86469a..e74f82dfb6d 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2867,7 +2867,7 @@ static void direct_link_cachefile(FileData *fd, CacheFile *cache_file)
 
 static void lib_link_workspace_scene_data(FileData *fd, WorkSpace *workspace)
 {
-	for (WorkSpaceSceneRelation *relation = workspace->scene_relations.first;
+	for (WorkSpaceSceneRelation *relation = workspace->scene_layer_relations.first;
 		 relation != NULL;
 		 relation = relation->next)
 	{
@@ -2917,7 +2917,7 @@ static void direct_link_workspace(FileData *fd, WorkSpace *workspace, const Main
 {
 	link_list(fd, BKE_workspace_layouts_get(workspace));
 	link_list(fd, &workspace->hook_layout_relations);
-	link_list(fd, &workspace->scene_relations);
+	link_list(fd, &workspace->scene_layer_relations);
 	link_list(fd, &workspace->owner_ids);
 	link_list(fd, &workspace->tools);
 
@@ -7133,7 +7133,7 @@ static void lib_link_clipboard_restore(struct IDNameLib_Map *id_map)
 
 static void lib_link_workspace_scene_data_restore(struct IDNameLib_Map *id_map, WorkSpace *workspace)
 {
-	for (WorkSpaceSceneRelation *relation = workspace->scene_relations.first;
+	for (WorkSpaceSceneRelation *relation = workspace->scene_layer_relations.first;
 		 relation != NULL;
 		 relation = relation->next)
 	{
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index a9c266c2bb2..de1699e24b7 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -3602,7 +3602,7 @@ static void write_workspace(WriteData *wd, WorkSpace *workspace)
 	writestruct(wd, ID_WS, WorkSpace, 1, workspace);
 	writelist(wd, DATA, WorkSpaceLayout, layouts);
 	writelist(wd, DATA, WorkSpaceDataRelation, &workspace->hook_layout_relations);
-	writelist(wd, DATA, WorkSpaceDataRelation, &workspace->scene_relations);
+	writelist(wd, DATA, WorkSpaceSceneRelation, &workspace->scene_layer_relations);
 	writelist(wd, DATA, wmOwnerID, &workspace->owner_ids);
 	writelist(wd, DATA, bToolRef, &workspace->tools);
 	for (bToolRef *tref = workspace->tools.first; tref; tref = tref->next) {
diff --git a/source/blender/makesdna/DNA_workspace_types.h b/source/blender/makesdna/DNA_workspace_types.h
index f3e145e9b55..b29e1f808c0 100644
--- a/source/blender/makesdna/DNA_workspace_types.h
+++ b/source/blender/makesdna/DNA_workspace_types.h
@@ -126,7 +126,7 @@ typedef struct WorkSpace {
 	/* Store for each hook (so for each window) which layout has
 	 * been activated the last time this workspace was visible. */
 	ListBase hook_layout_relations DNA_PRIVATE_WORKSPACE_READ_WRITE; /* WorkSpaceDataRelation */
-	ListBase scene_relations; /* WorkSpaceSceneRelation */
+	ListBase scene_layer_relations; /* WorkSpaceSceneRelation */
 
 	/* Feature tagging (use for addons) */
 	ListBase owner_ids DNA_PRIVATE_WORKSPACE_READ_WRITE; /* wmOwnerID */



More information about the Bf-blender-cvs mailing list