From e32d29a6db0b593e4e61188ed3ffc1449605ebc9 Mon Sep 17 00:00:00 2001 From: thilo Date: Sun, 6 Apr 2008 02:13:43 +0000 Subject: Make sure that one broken shader file cannot crash the game / make the other shaders unusable. git-svn-id: svn://svn.icculus.org/quake3/trunk@1295 edf5b092-35ff-0310-97b2-ce42778d08ea --- code/renderer/tr_shader.c | 50 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) (limited to 'code/renderer') diff --git a/code/renderer/tr_shader.c b/code/renderer/tr_shader.c index 275e32d..830a410 100644 --- a/code/renderer/tr_shader.c +++ b/code/renderer/tr_shader.c @@ -2868,7 +2868,7 @@ static void ScanAndLoadShaderFiles( void ) 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 @@ static void ScanAndLoadShaderFiles( void ) 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 @@ static void ScanAndLoadShaderFiles( void ) 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 -- cgit v1.2.3