[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14123] trunk/blender/source/blender: fix for [#8559] Python script that uses FIleSelector and has an error in it segfaults Blender

Campbell Barton ideasman42 at gmail.com
Sat Mar 15 19:53:43 CET 2008


Revision: 14123
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14123
Author:   campbellbarton
Date:     2008-03-15 19:53:42 +0100 (Sat, 15 Mar 2008)

Log Message:
-----------
fix for [#8559] Python script that uses FIleSelector and has an error in it segfaults Blender

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/script.c
    trunk/blender/source/blender/python/BPY_extern.h
    trunk/blender/source/blender/python/BPY_interface.c
    trunk/blender/source/blender/python/api2_2x/Draw.c
    trunk/blender/source/blender/src/drawtext.c

Modified: trunk/blender/source/blender/blenkernel/intern/script.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/script.c	2008-03-15 17:19:53 UTC (rev 14122)
+++ trunk/blender/source/blender/blenkernel/intern/script.c	2008-03-15 18:53:42 UTC (rev 14123)
@@ -60,12 +60,5 @@
 void free_script (Script *script)
 {
 	if (!script) return;
-
-	if (script->py_globaldict || script->py_button ||
-			script->py_event || script->py_draw)
-	{
-		BPY_clear_script(script);
-	}
-
-	return;
+	BPY_clear_script(script);
 }

Modified: trunk/blender/source/blender/python/BPY_extern.h
===================================================================
--- trunk/blender/source/blender/python/BPY_extern.h	2008-03-15 17:19:53 UTC (rev 14122)
+++ trunk/blender/source/blender/python/BPY_extern.h	2008-03-15 18:53:42 UTC (rev 14123)
@@ -128,7 +128,9 @@
 	void BPY_clear_script( struct Script *script );
 	void BPY_free_finished_script( struct Script *script );
 	void BPY_scripts_clear_pyobjects( void );
-
+	
+	void error_pyscript( void );
+	
 /* void BPY_Err_Handle(struct Text *text); */
 /* void BPY_clear_bad_scriptlink(struct ID *id, struct Text *byebye); */
 /* void BPY_clear_bad_scriptlist(struct ListBase *, struct Text *byebye); */

Modified: trunk/blender/source/blender/python/BPY_interface.c
===================================================================
--- trunk/blender/source/blender/python/BPY_interface.c	2008-03-15 17:19:53 UTC (rev 14122)
+++ trunk/blender/source/blender/python/BPY_interface.c	2008-03-15 18:53:42 UTC (rev 14123)
@@ -284,7 +284,6 @@
 	 * Python is finalized and G.main is freed in exit_usiblender() */
 	for (script = G.main->script.first; script; script = next_script) {
 		next_script = script->id.next;
-		BPY_clear_script(script);
 		free_libblock( &G.main->script, script );
 	}
 
@@ -693,8 +692,7 @@
 		BPY_Err_Handle( textname );
 		ReleaseGlobalDictionary( py_dict );
 		script->py_globaldict = NULL;
-		if( G.main->script.first )
-			free_libblock( &G.main->script, script );
+		free_libblock( &G.main->script, script );
 		PyGILState_Release(gilstate);
 		return 0;
 	} else {
@@ -817,8 +815,7 @@
 		fp = fopen( script->scriptname, "rb" );
 		if( !fp ) {
 			printf( "Error loading script: couldn't open file %s\n", script->scriptname );
-			if( G.main->script.first )
-				free_libblock( &G.main->script, script );
+			free_libblock( &G.main->script, script );
 			PyGILState_Release(gilstate);
 			return 0;
 		}
@@ -844,8 +841,7 @@
 
 	if( !setup_armature_weakrefs()){
 		printf("Oops - weakref dict\n");
-		if( G.main->script.first )
-			free_libblock( &G.main->script, script );
+		free_libblock( &G.main->script, script );
 		ReleaseGlobalDictionary( py_dict );
 		MEM_freeN( buffer );
 		PyGILState_Release(gilstate);
@@ -912,9 +908,8 @@
 		BPY_Err_Handle( script->id.name + 2 );
 		ReleaseGlobalDictionary( py_dict );
 		script->py_globaldict = NULL;
-		if( G.main->script.first )
-			free_libblock( &G.main->script, script );
-		error( "Python script error: check console" );
+		free_libblock( &G.main->script, script );
+		error_pyscript(  );
 
 		PyGILState_Release(gilstate);
 		return 0;
@@ -1112,7 +1107,7 @@
 
 	if( PyErr_Occurred(  ) ) {	/* if script ended after filesel */
 		PyErr_Print(  );	/* eventual errors are handled now */
-		error( "Python script error: check console" );
+		error_pyscript(  );
 	}
 
 	PyGILState_Release(gilstate);
@@ -1148,6 +1143,7 @@
 	}
 }
 
+/* This is called from free_libblock( &G.main->script, script ); */
 void BPY_clear_script( Script * script )
 {
 	PyObject *dict;
@@ -2963,3 +2959,7 @@
 		SCRIPT_SET_NULL(script)
 	}
 }
+void error_pyscript( void )
+{
+	error("Python script error: check console");
+}

Modified: trunk/blender/source/blender/python/api2_2x/Draw.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Draw.c	2008-03-15 17:19:53 UTC (rev 14122)
+++ trunk/blender/source/blender/python/api2_2x/Draw.c	2008-03-15 18:53:42 UTC (rev 14123)
@@ -617,7 +617,8 @@
 	if( err ) {
 		PyErr_Print(  );
 		script->flags = 0;	/* mark script struct for deletion */
-		error( "Python script error: check console" );
+		SCRIPT_SET_NULL(script);
+		error_pyscript();
 		scrarea_queue_redraw( sc->area );
 	}
 
@@ -837,7 +838,7 @@
 	if (!result) {
 		Py_DECREF(pyvalue);
 		PyErr_Print(  );
-		error( "Python script error: check console" );
+		error_pyscript(  );
 	}
 	Py_XDECREF( result );
 }
@@ -1109,7 +1110,7 @@
 	
 	if (!result) {
 		PyErr_Print(  );
-		error( "Python script error: check console" );
+		error_pyscript(  );
 	} else {
 		/* copied from do_clever_numbuts in toolbox.c */
 		

Modified: trunk/blender/source/blender/src/drawtext.c
===================================================================
--- trunk/blender/source/blender/src/drawtext.c	2008-03-15 17:19:53 UTC (rev 14122)
+++ trunk/blender/source/blender/src/drawtext.c	2008-03-15 18:53:42 UTC (rev 14123)
@@ -1442,7 +1442,7 @@
 		if (!st->text) return;
 
 		if (!strcmp(py_filename, st->text->id.name+2)) {
-			error("Python script error, check console");
+			error_pyscript(  );
 			if (lineno >= 0) {
 				txt_move_toline(text, lineno-1, 0);
 				txt_sel_line(text);





More information about the Bf-blender-cvs mailing list