Make sure that one broken shader file cannot crash the game / make the other shaders unusable.

This commit is contained in:
Thilo Schulz 2008-04-06 02:13:43 +00:00
parent 85bee47f52
commit 5c1167557a
2 changed files with 42 additions and 10 deletions

View file

@ -599,7 +599,7 @@ void SkipBracedSection (char **program) {
depth = 0; depth = 0;
do { do {
token = COM_ParseExt( program, qtrue ); token = COM_ParseExt( program, qtrue );
if( token[1] == 0 ) { if( *program && token[1] == 0 ) {
if( token[0] == '{' ) { if( token[0] == '{' ) {
depth++; depth++;
} }

View file

@ -2868,7 +2868,7 @@ static void ScanAndLoadShaderFiles( void )
char *oldp, *token, *hashMem; char *oldp, *token, *hashMem;
int shaderTextHashTableSizes[MAX_SHADERTEXT_HASH], hash, size; int shaderTextHashTableSizes[MAX_SHADERTEXT_HASH], hash, size;
long sum = 0; long sum = 0, summand;
// scan for shader files // scan for shader files
shaderFiles = ri.FS_ListFiles( "scripts", ".shader", &numShaderFiles ); shaderFiles = ri.FS_ListFiles( "scripts", ".shader", &numShaderFiles );
@ -2889,10 +2889,38 @@ static void ScanAndLoadShaderFiles( void )
Com_sprintf( filename, sizeof( filename ), "scripts/%s", shaderFiles[i] ); Com_sprintf( filename, sizeof( filename ), "scripts/%s", shaderFiles[i] );
ri.Printf( PRINT_DEVELOPER, "...loading '%s'\n", filename ); ri.Printf( PRINT_DEVELOPER, "...loading '%s'\n", filename );
sum += ri.FS_ReadFile( filename, (void **)&buffers[i] ); summand = ri.FS_ReadFile( filename, (void **)&buffers[i] );
if ( !buffers[i] ) {
if ( !buffers[i] )
ri.Error( ERR_DROP, "Couldn't load %s", filename ); 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 // build single large buffer
@ -2900,13 +2928,17 @@ static void ScanAndLoadShaderFiles( void )
s_shaderText[ 0 ] = '\0'; s_shaderText[ 0 ] = '\0';
// free in reverse order, so the temp files are all dumped // free in reverse order, so the temp files are all dumped
for ( i = numShaderFiles - 1; i >= 0 ; i-- ) { for ( i = numShaderFiles - 1; i >= 0 ; i-- )
{
if(buffers[i])
{
p = &s_shaderText[strlen(s_shaderText)]; p = &s_shaderText[strlen(s_shaderText)];
strcat( s_shaderText, buffers[i] ); strcat( s_shaderText, buffers[i] );
ri.FS_FreeFile( buffers[i] ); ri.FS_FreeFile( buffers[i] );
COM_Compress(p); COM_Compress(p);
strcat( s_shaderText, "\n" ); strcat( s_shaderText, "\n" );
} }
}
// free up memory // free up memory
ri.FS_FreeFileList( shaderFiles ); ri.FS_FreeFileList( shaderFiles );