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