Skip to content

Commit e8e3e0c

Browse files
authored
Merge pull request mapbase-source#130 from z33ky/mb/scene.image-parse-fixes
Fix scene loading memory errors
2 parents ee0279f + 46b6f25 commit e8e3e0c

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed

sp/src/game/server/sceneentity.cpp

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3735,7 +3735,7 @@ CChoreoScene *CSceneEntity::LoadScene( const char *filename, IChoreoEventCallbac
37353735
Q_FixSlashes( loadfile );
37363736

37373737
// binary compiled vcd
3738-
void *pBuffer;
3738+
void *pBuffer = NULL;
37393739
#ifdef MAPBASE
37403740
//
37413741
// Raw scene file support
@@ -3760,12 +3760,13 @@ CChoreoScene *CSceneEntity::LoadScene( const char *filename, IChoreoEventCallbac
37603760
{
37613761
g_TokenProcessor.SetBuffer((char*)pBuffer);
37623762
pScene = ChoreoLoadScene( loadfile, NULL, &g_TokenProcessor, LocalScene_Printf );
3763+
g_TokenProcessor.SetBuffer(NULL);
37633764
}
37643765
// Okay, it's definitely missing.
37653766
else
37663767
{
37673768
MissingSceneWarning( loadfile );
3768-
return NULL;
3769+
pScene = NULL;
37693770
}
37703771

37713772
if (pScene)
@@ -4283,6 +4284,7 @@ CBaseEntity *CSceneEntity::FindNamedEntity( const char *name, CBaseEntity *pActo
42834284
#ifdef MAPBASE
42844285
const char *GetFirstSoundInScene(const char *pszScene)
42854286
{
4287+
const char *soundName;
42864288
SceneCachedData_t sceneData;
42874289
if ( scenefilecache->GetSceneCachedData( pszScene, &sceneData ) )
42884290
{
@@ -4292,30 +4294,35 @@ const char *GetFirstSoundInScene(const char *pszScene)
42924294
short stringId = scenefilecache->GetSceneCachedSound( sceneData.sceneId, 0 );
42934295

42944296
// Trust that it's been precached
4295-
return scenefilecache->GetSceneString( stringId );
4297+
soundName = scenefilecache->GetSceneString( stringId );
42964298
}
42974299
}
42984300
else
42994301
{
43004302
void *pBuffer = NULL;
4301-
if (filesystem->ReadFileEx( pszScene, "MOD", &pBuffer, false, true ))
4303+
if (filesystem->ReadFileEx( pszScene, "MOD", &pBuffer, true ))
43024304
{
43034305
g_TokenProcessor.SetBuffer((char*)pBuffer);
43044306
CChoreoScene *pScene = ChoreoLoadScene( pszScene, NULL, &g_TokenProcessor, LocalScene_Printf );
4307+
g_TokenProcessor.SetBuffer(NULL);
43054308
if (pScene)
43064309
{
43074310
for (int i = 0; i < pScene->GetNumEvents(); i++)
43084311
{
43094312
CChoreoEvent *pEvent = pScene->GetEvent(i);
43104313

43114314
if (pEvent->GetType() == CChoreoEvent::SPEAK)
4312-
return pEvent->GetParameters();
4315+
{
4316+
soundName = pEvent->GetParameters();
4317+
break;
4318+
}
43134319
}
43144320
}
43154321
}
4322+
FreeSceneFileMemory( pBuffer );
43164323
}
43174324

4318-
return NULL;
4325+
return soundName;
43194326
}
43204327

43214328
const char *GetFirstSoundInScene(CChoreoScene *scene)
@@ -4483,6 +4490,8 @@ bool CSceneEntity::ScriptLoadSceneFromString(const char* pszFilename, const char
44834490
PrecacheScene(pScene);
44844491
}
44854492

4493+
g_TokenProcessor.SetBuffer(NULL);
4494+
44864495
if (pScene != NULL)
44874496
{
44884497
// release prior scene if present
@@ -5284,12 +5293,12 @@ int GetSceneSpeechCount( char const *pszScene )
52845293
else
52855294
{
52865295
void *pBuffer = NULL;
5287-
if (filesystem->ReadFileEx( pszScene, "MOD", &pBuffer, false, true ))
5296+
int iNumSounds = 0;
5297+
if (filesystem->ReadFileEx( pszScene, "MOD", &pBuffer, true ))
52885298
{
5289-
int iNumSounds = 0;
5290-
52915299
g_TokenProcessor.SetBuffer((char*)pBuffer);
52925300
CChoreoScene *pScene = ChoreoLoadScene( pszScene, NULL, &g_TokenProcessor, LocalScene_Printf );
5301+
g_TokenProcessor.SetBuffer(NULL);
52935302
if (pScene)
52945303
{
52955304
for (int i = 0; i < pScene->GetNumEvents(); i++)
@@ -5300,9 +5309,11 @@ int GetSceneSpeechCount( char const *pszScene )
53005309
iNumSounds++;
53015310
}
53025311
}
5303-
5304-
return iNumSounds;
53055312
}
5313+
5314+
FreeSceneFileMemory( pBuffer );
5315+
5316+
return iNumSounds;
53065317
}
53075318
#endif
53085319
return 0;
@@ -5359,15 +5370,17 @@ void PrecacheInstancedScene( char const *pszScene )
53595370

53605371
// Attempt to precache manually
53615372
void *pBuffer = NULL;
5362-
if (filesystem->ReadFileEx( loadfile, "MOD", &pBuffer, false, true ))
5373+
if (filesystem->ReadFileEx( loadfile, "MOD", &pBuffer, true ))
53635374
{
53645375
g_TokenProcessor.SetBuffer((char*)pBuffer);
53655376
CChoreoScene *pScene = ChoreoLoadScene( loadfile, NULL, &g_TokenProcessor, LocalScene_Printf );
53665377
if (pScene)
53675378
{
53685379
PrecacheChoreoScene(pScene);
53695380
}
5381+
g_TokenProcessor.SetBuffer(NULL);
53705382
}
5383+
FreeSceneFileMemory( pBuffer );
53715384
#else
53725385
// Scenes are sloppy and don't always exist.
53735386
// A scene that is not in the pre-built cache image, but on disk, is a true error.

0 commit comments

Comments
 (0)