mirror of
https://github.com/UberGames/ioef.git
synced 2024-11-24 13:11:30 +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;
|
||||
do {
|
||||
token = COM_ParseExt( program, qtrue );
|
||||
if( token[1] == 0 ) {
|
||||
if( *program && token[1] == 0 ) {
|
||||
if( token[0] == '{' ) {
|
||||
depth++;
|
||||
}
|
||||
|
|
|
@ -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,13 +2928,17 @@ 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-- ) {
|
||||
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
|
||||
ri.FS_FreeFileList( shaderFiles );
|
||||
|
|
Loading…
Reference in a new issue