[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56509] trunk/blender/source/blender/ blenloader/intern/readfile.c: Bug fix #35179

Ton Roosendaal ton at blender.org
Mon May 6 13:23:13 CEST 2013


Revision: 56509
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56509
Author:   ton
Date:     2013-05-06 11:23:13 +0000 (Mon, 06 May 2013)
Log Message:
-----------
Bug fix #35179

Added provision for saved corrupt blend files - caused by a startup.blend 
addressing > 16 GB space, which was read in 32 bits.

Now an invalid screen will get removed immediate after read. Might give
a memory-not-in-memlist print, but that's quite safe.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2013-05-06 11:12:00 UTC (rev 56508)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2013-05-06 11:23:13 UTC (rev 56509)
@@ -6148,11 +6148,12 @@
 		v3d->twtype = V3D_MANIP_TRANSLATE;
 }
 
-static void direct_link_screen(FileData *fd, bScreen *sc)
+static bool direct_link_screen(FileData *fd, bScreen *sc)
 {
 	ScrArea *sa;
 	ScrVert *sv;
 	ScrEdge *se;
+	bool wrong_id = false;
 	
 	link_list(fd, &(sc->vertbase));
 	link_list(fd, &(sc->edgebase));
@@ -6174,8 +6175,8 @@
 		}
 		
 		if (se->v1 == NULL) {
-			printf("error reading screen... file corrupt\n");
-			se->v1 = se->v2;
+			printf("Error reading Screen %s... removing it.\n", sc->id.name+2);
+			wrong_id = true;
 		}
 	}
 	
@@ -6409,6 +6410,8 @@
 		sa->v3 = newdataadr(fd, sa->v3);
 		sa->v4 = newdataadr(fd, sa->v4);
 	}
+	
+	return wrong_id;
 }
 
 /* ********** READ LIBRARY *************** */
@@ -7016,6 +7019,7 @@
 	ID *id;
 	ListBase *lb;
 	const char *allocname;
+	bool wrong_id;
 	
 	/* read libblock */
 	id = read_struct(fd, bhead, "lib block");
@@ -7063,7 +7067,7 @@
 			direct_link_windowmanager(fd, (wmWindowManager *)id);
 			break;
 		case ID_SCR:
-			direct_link_screen(fd, (bScreen *)id);
+			wrong_id = direct_link_screen(fd, (bScreen *)id);
 			break;
 		case ID_SCE:
 			direct_link_scene(fd, (Scene *)id);
@@ -7160,6 +7164,10 @@
 	oldnewmap_free_unused(fd->datamap);
 	oldnewmap_clear(fd->datamap);
 	
+	if (wrong_id) {
+		BKE_libblock_free(lb, id);
+	}
+	
 	return (bhead);
 }
 




More information about the Bf-blender-cvs mailing list