mirror of
https://github.com/ioquake/ioq3.git
synced 2024-11-10 15:21:35 +00:00
Make sure that one broken shader file cannot crash the game / make the other shaders unusable.
This commit is contained in:
parent
85bee47f52
commit
5c1167557a
2 changed files with 42 additions and 10 deletions
|
@ -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++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,12 +2928,16 @@ 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-- )
|
||||||
p = &s_shaderText[strlen(s_shaderText)];
|
{
|
||||||
strcat( s_shaderText, buffers[i] );
|
if(buffers[i])
|
||||||
ri.FS_FreeFile( buffers[i] );
|
{
|
||||||
COM_Compress(p);
|
p = &s_shaderText[strlen(s_shaderText)];
|
||||||
strcat( s_shaderText, "\n" );
|
strcat( s_shaderText, buffers[i] );
|
||||||
|
ri.FS_FreeFile( buffers[i] );
|
||||||
|
COM_Compress(p);
|
||||||
|
strcat( s_shaderText, "\n" );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// free up memory
|
// free up memory
|
||||||
|
|
Loading…
Reference in a new issue