* Move storage of console history from a cvar to a file in order to alleviate

security concerns
This commit is contained in:
Tim Angus 2007-04-01 13:38:17 +00:00
parent f9bb47d9af
commit fb58d8f123
1 changed files with 74 additions and 47 deletions

View File

@ -1373,7 +1373,9 @@ void Key_ClearStates (void)
// This must not exceed MAX_CMD_LINE // This must not exceed MAX_CMD_LINE
#define MAX_CONSOLE_SAVE_BUFFER 1024 #define MAX_CONSOLE_SAVE_BUFFER 1024
#define CONSOLE_HISTORY_FILE "q3history"
static char consoleSaveBuffer[ MAX_CONSOLE_SAVE_BUFFER ]; static char consoleSaveBuffer[ MAX_CONSOLE_SAVE_BUFFER ];
static int consoleSaveBufferSize = 0;
/* /*
================ ================
@ -1386,11 +1388,18 @@ void CL_LoadConsoleHistory( void )
{ {
char *token, *text_p; char *token, *text_p;
int i, numChars, numLines = 0; int i, numChars, numLines = 0;
cvar_t *cv; fileHandle_t f;
cv = Cvar_Get( "cl_consoleHistory", "", CVAR_ARCHIVE|CVAR_ROM ); consoleSaveBufferSize = FS_FOpenFileRead( CONSOLE_HISTORY_FILE, &f, qfalse );
Q_strncpyz( consoleSaveBuffer, cv->string, MAX_CONSOLE_SAVE_BUFFER ); if( !f )
{
Com_Printf( "Couldn't read %s.\n", CONSOLE_HISTORY_FILE );
return;
}
if( consoleSaveBufferSize <= MAX_CONSOLE_SAVE_BUFFER &&
FS_Read( consoleSaveBuffer, consoleSaveBufferSize, f ) == consoleSaveBufferSize )
{
text_p = consoleSaveBuffer; text_p = consoleSaveBuffer;
for( i = COMMAND_HISTORY - 1; i >= 0; i-- ) for( i = COMMAND_HISTORY - 1; i >= 0; i-- )
@ -1430,6 +1439,11 @@ void CL_LoadConsoleHistory( void )
historyLine = nextHistoryLine = numLines; historyLine = nextHistoryLine = numLines;
} }
else
Com_Printf( "Couldn't read %s.\n", CONSOLE_HISTORY_FILE );
FS_FCloseFile( f );
}
/* /*
================ ================
@ -1443,6 +1457,7 @@ void CL_SaveConsoleHistory( void )
{ {
int i; int i;
int lineLength, saveBufferLength, additionalLength; int lineLength, saveBufferLength, additionalLength;
fileHandle_t f;
consoleSaveBuffer[ 0 ] = '\0'; consoleSaveBuffer[ 0 ] = '\0';
@ -1454,8 +1469,8 @@ void CL_SaveConsoleHistory( void )
lineLength = strlen( historyEditLines[ i ].buffer ); lineLength = strlen( historyEditLines[ i ].buffer );
saveBufferLength = strlen( consoleSaveBuffer ); saveBufferLength = strlen( consoleSaveBuffer );
//ICK "seta cl_consoleHistory " + "%d %d %d " = 23 + 13 = 36 //ICK
additionalLength = lineLength + 36; additionalLength = lineLength + strlen( "999 999 999 " );
if( saveBufferLength + additionalLength < MAX_CONSOLE_SAVE_BUFFER ) if( saveBufferLength + additionalLength < MAX_CONSOLE_SAVE_BUFFER )
{ {
@ -1473,5 +1488,17 @@ void CL_SaveConsoleHistory( void )
} }
while( i != ( nextHistoryLine - 1 ) % COMMAND_HISTORY ); while( i != ( nextHistoryLine - 1 ) % COMMAND_HISTORY );
Cvar_Set( "cl_consoleHistory", consoleSaveBuffer ); consoleSaveBufferSize = strlen( consoleSaveBuffer );
f = FS_FOpenFileWrite( CONSOLE_HISTORY_FILE );
if( !f )
{
Com_Printf( "Couldn't write %s.\n", CONSOLE_HISTORY_FILE );
return;
}
if( FS_Write( consoleSaveBuffer, consoleSaveBufferSize, f ) < consoleSaveBufferSize )
Com_Printf( "Couldn't write %s.\n", CONSOLE_HISTORY_FILE );
FS_FCloseFile( f );
} }