- Fixed P_CheckMapData allowed non-map lump names to pass resulting in a crash when actually trying to load the map.

This commit is contained in:
Braden Obrzut 2013-08-08 23:47:58 -04:00
parent 3480d40484
commit bb494292c6
3 changed files with 50 additions and 16 deletions

View File

@ -51,6 +51,7 @@
#include "i_system.h" #include "i_system.h"
#include "doomerrors.h"
#include "doomstat.h" #include "doomstat.h"
#include "gstrings.h" #include "gstrings.h"
#include "s_sound.h" #include "s_sound.h"
@ -342,6 +343,8 @@ CCMD (changemap)
} }
if (argv.argc() > 1) if (argv.argc() > 1)
{
try
{ {
if (!P_CheckMapData(argv[1])) if (!P_CheckMapData(argv[1]))
{ {
@ -361,6 +364,12 @@ CCMD (changemap)
Net_WriteString (argv[1]); Net_WriteString (argv[1]);
} }
} }
catch(CRecoverableError &error)
{
if (error.GetMessage())
Printf("%s", error.GetMessage());
}
}
else else
{ {
Printf ("Usage: changemap <map name> [position]\n"); Printf ("Usage: changemap <map name> [position]\n");

View File

@ -40,6 +40,7 @@
#include "s_sound.h" #include "s_sound.h"
#include "d_event.h" #include "d_event.h"
#include "m_random.h" #include "m_random.h"
#include "doomerrors.h"
#include "doomstat.h" #include "doomstat.h"
#include "wi_stuff.h" #include "wi_stuff.h"
#include "w_wad.h" #include "w_wad.h"
@ -169,6 +170,8 @@ CCMD (map)
return; return;
} }
if (argv.argc() > 1) if (argv.argc() > 1)
{
try
{ {
if (!P_CheckMapData(argv[1])) if (!P_CheckMapData(argv[1]))
{ {
@ -179,6 +182,12 @@ CCMD (map)
G_DeferedInitNew (argv[1]); G_DeferedInitNew (argv[1]);
} }
} }
catch(CRecoverableError &error)
{
if (error.GetMessage())
Printf("%s", error.GetMessage());
}
}
else else
{ {
Printf ("Usage: map <map name>\n"); Printf ("Usage: map <map name>\n");

View File

@ -329,7 +329,15 @@ MapData *P_OpenMapData(const char * mapname)
// Since levels must be stored in WADs they can't really have full // Since levels must be stored in WADs they can't really have full
// names and for any valid level lump this always returns the short name. // names and for any valid level lump this always returns the short name.
const char * lumpname = Wads.GetLumpFullName(lump_name + i); const char * lumpname = Wads.GetLumpFullName(lump_name + i);
index = GetMapIndex(mapname, index, lumpname, i != 1 || Wads.LumpLength(lump_name + i) == 0); try
{
index = GetMapIndex(mapname, index, lumpname, true);
}
catch(...)
{
delete map;
throw;
}
if (index == ML_BEHAVIOR) map->HasBehavior = true; if (index == ML_BEHAVIOR) map->HasBehavior = true;
// The next lump is not part of this map anymore // The next lump is not part of this map anymore
@ -460,8 +468,16 @@ MapData *P_OpenMapData(const char * mapname)
} }
if (i>0) if (i>0)
{
try
{ {
index = GetMapIndex(maplabel, index, lumpname, true); index = GetMapIndex(maplabel, index, lumpname, true);
}
catch(...)
{
delete map;
throw;
}
if (index == ML_BEHAVIOR) map->HasBehavior = true; if (index == ML_BEHAVIOR) map->HasBehavior = true;
// The next lump is not part of this map anymore // The next lump is not part of this map anymore