r1295 - in trunk/code: qcommon renderer

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sat Apr 5 22:13:44 EDT 2008


Author: thilo
Date: 2008-04-05 22:13:43 -0400 (Sat, 05 Apr 2008)
New Revision: 1295

Modified:
   trunk/code/qcommon/q_shared.c
   trunk/code/renderer/tr_shader.c
Log:
Make sure that one broken shader file cannot crash the game / make the other shaders unusable.


Modified: trunk/code/qcommon/q_shared.c
===================================================================
--- trunk/code/qcommon/q_shared.c	2008-04-05 16:01:58 UTC (rev 1294)
+++ trunk/code/qcommon/q_shared.c	2008-04-06 02:13:43 UTC (rev 1295)
@@ -599,7 +599,7 @@
 	depth = 0;
 	do {
 		token = COM_ParseExt( program, qtrue );
-		if( token[1] == 0 ) {
+		if( *program && token[1] == 0 ) {
 			if( token[0] == '{' ) {
 				depth++;
 			}

Modified: trunk/code/renderer/tr_shader.c
===================================================================
--- trunk/code/renderer/tr_shader.c	2008-04-05 16:01:58 UTC (rev 1294)
+++ trunk/code/renderer/tr_shader.c	2008-04-06 02:13:43 UTC (rev 1295)
@@ -2868,7 +2868,7 @@
 	char *oldp, *token, *hashMem;
 	int shaderTextHashTableSizes[MAX_SHADERTEXT_HASH], hash, size;
 
-	long sum = 0;
+	long sum = 0, summand;
 	// scan for shader files
 	shaderFiles = ri.FS_ListFiles( "scripts", ".shader", &numShaderFiles );
 
@@ -2889,10 +2889,38 @@
 
 		Com_sprintf( filename, sizeof( filename ), "scripts/%s", shaderFiles[i] );
 		ri.Printf( PRINT_DEVELOPER, "...loading '%s'\n", filename );
-		sum += ri.FS_ReadFile( filename, (void **)&buffers[i] );
-		if ( !buffers[i] ) {
+		summand = ri.FS_ReadFile( filename, (void **)&buffers[i] );
+		
+		if ( !buffers[i] )
 			ri.Error( ERR_DROP, "Couldn't load %s", filename );
+		
+		// Do a simple check on the shader structure in that file to make sure one bad shader file cannot fuck up all other shaders.
+		p = buffers[i];
+		while(1)
+		{
+			token = COM_ParseExt(&p, qtrue);
+			
+			if(!*token)
+				break;
+			
+			oldp = p;
+			
+			token = COM_ParseExt(&p, qtrue);
+			if(*token != '{')
+			{
+				ri.Printf(PRINT_WARNING, "WARNING: Bad shader file %s has incorrect syntax.\n", filename);
+				ri.FS_FreeFile(buffers[i]);
+				buffers[i] = NULL;
+				break;
+			}
+
+			SkipBracedSection(&oldp);
+			p = oldp;
 		}
+			
+		
+		if (buffers[i])
+			sum += summand;		
 	}
 
 	// build single large buffer
@@ -2900,12 +2928,16 @@
 	s_shaderText[ 0 ] = '\0';
 
 	// free in reverse order, so the temp files are all dumped
-	for ( i = numShaderFiles - 1; i >= 0 ; i-- ) {
-		p = &s_shaderText[strlen(s_shaderText)];
-		strcat( s_shaderText, buffers[i] );
-		ri.FS_FreeFile( buffers[i] );
-		COM_Compress(p);
-		strcat( s_shaderText, "\n" );
+	for ( i = numShaderFiles - 1; i >= 0 ; i-- )
+	{
+		if(buffers[i])
+		{
+			p = &s_shaderText[strlen(s_shaderText)];
+			strcat( s_shaderText, buffers[i] );
+			ri.FS_FreeFile( buffers[i] );
+			COM_Compress(p);
+			strcat( s_shaderText, "\n" );
+		}
 	}
 
 	// free up memory




More information about the quake3-commits mailing list