Prevent a potential buffer overflow in function enumerateMultiMaps by altering its interface

git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@6261 4a71c877-e1ca-e34f-864e-861f7616d084
master
Giel van Schijndel 2008-11-09 23:18:18 +00:00
parent c99a123b50
commit 57ea72c23d
1 changed files with 36 additions and 14 deletions

View File

@ -175,10 +175,10 @@ static void SetPlayerTextColor( int mode, UDWORD player )
// //////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////
// enumerates maps in the gamedesc file. // enumerates maps in the gamedesc file.
// returns only maps that are valid the right 'type' // returns only maps that are valid the right 'type'
static BOOL enumerateMultiMaps(char *found, UDWORD *players,BOOL first, UBYTE camToUse, UBYTE numPlayers) static char* enumerateMultiMaps(UDWORD* players, bool first, unsigned int camToUse, unsigned int numPlayers)
{ {
static LEVEL_DATASET *lev; static LEVEL_DATASET *lev;
UBYTE cam; unsigned int cam;
if(first) if(first)
{ {
@ -205,10 +205,18 @@ static BOOL enumerateMultiMaps(char *found, UDWORD *players,BOOL first, UBYTE ca
&& (numPlayers == 0 || numPlayers == lev->players) && (numPlayers == 0 || numPlayers == lev->players)
&& cam == camToUse ) && cam == camToUse )
{ {
strcpy(found,lev->pName); char* const found = strdup(lev->pName);
if (found == NULL)
{
debug(LOG_ERROR, "Out of memory");
// No way to indicate out-of-memory failure by return value
abort();
return NULL;
}
*players = lev->players; *players = lev->players;
lev = lev->psNext; lev = lev->psNext;
return true; return found;
} }
} }
else // campaign else // campaign
@ -232,15 +240,24 @@ static BOOL enumerateMultiMaps(char *found, UDWORD *players,BOOL first, UBYTE ca
&& (numPlayers == 0 || numPlayers == lev->players) && (numPlayers == 0 || numPlayers == lev->players)
&& cam == camToUse ) && cam == camToUse )
{ {
strcpy(found,lev->pName); char* const found = strdup(lev->pName);
if (found == NULL)
{
debug(LOG_ERROR, "Out of memory");
// No way to indicate out-of-memory failure by return value
abort();
return NULL;
}
*players = lev->players; *players = lev->players;
lev = lev->psNext; lev = lev->psNext;
return true; return found;
} }
} }
lev = lev->psNext; lev = lev->psNext;
} }
return false;
return NULL;
} }
// //////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////
@ -376,11 +393,14 @@ void addMultiRequest(const char* searchDir, const char* fileExtension, UDWORD mo
if(mode == MULTIOP_MAP) // if its a map, also look in the predone stuff. if(mode == MULTIOP_MAP) // if its a map, also look in the predone stuff.
{ {
if(enumerateMultiMaps(tips[0],&players, true,mapCam,numPlayers)) char* map;
if ((map = enumerateMultiMaps(&players, true, mapCam, numPlayers)))
{ {
free(map);
numButtons++; numButtons++;
while(enumerateMultiMaps(tips[0],&players, false,mapCam,numPlayers)) while ((map = enumerateMultiMaps(&players, false, mapCam, numPlayers)))
{ {
free(map);
numButtons++; numButtons++;
} }
} }
@ -534,14 +554,16 @@ void addMultiRequest(const char* searchDir, const char* fileExtension, UDWORD mo
if(mode == MULTIOP_MAP) if(mode == MULTIOP_MAP)
{ {
char sTemp[64]; char* mapName;
if(enumerateMultiMaps( sTemp,&players,true,mapCam,numPlayers)) if ((mapName = enumerateMultiMaps(&players, true, mapCam, numPlayers)))
{
do
{ {
do{
unsigned int tip_index = check_tip_index(sButInit.id-M_REQUEST_BUT); unsigned int tip_index = check_tip_index(sButInit.id-M_REQUEST_BUT);
// add number of players to string. // add number of players to string.
sprintf(tips[tip_index],"%s",sTemp ); sstrcpy(tips[tip_index], mapName);
free(mapName);
sButInit.pTip = tips[tip_index]; sButInit.pTip = tips[tip_index];
sButInit.pText = tips[tip_index]; sButInit.pText = tips[tip_index];
@ -561,7 +583,7 @@ void addMultiRequest(const char* searchDir, const char* fileExtension, UDWORD mo
sButInit.y = 4; sButInit.y = 4;
sButInit.majorID += 1; sButInit.majorID += 1;
} }
}while(enumerateMultiMaps(sTemp,&players,false,mapCam,numPlayers)); } while ((mapName = enumerateMultiMaps(&players, false, mapCam, numPlayers)));
} }
} }
multiRequestUp = true; multiRequestUp = true;