aboutsummaryrefslogtreecommitdiffstats
path: root/code/client/cl_keys.c
diff options
context:
space:
mode:
authortma <tma@edf5b092-35ff-0310-97b2-ce42778d08ea>2007-04-01 13:38:17 +0000
committertma <tma@edf5b092-35ff-0310-97b2-ce42778d08ea>2007-04-01 13:38:17 +0000
commit789f22f9900b052f50c526ceac34407f91c346b7 (patch)
treeeeb788d7f26c16684a8ad7f9bce1df26b0be9698 /code/client/cl_keys.c
parenta3ece0ec269afc8ec40b7d1ffb987327ce4e2d9b (diff)
downloadioquake3-aero-789f22f9900b052f50c526ceac34407f91c346b7.tar.gz
ioquake3-aero-789f22f9900b052f50c526ceac34407f91c346b7.zip
* Move storage of console history from a cvar to a file in order to alleviate
security concerns git-svn-id: svn://svn.icculus.org/quake3/trunk@1054 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'code/client/cl_keys.c')
-rw-r--r--code/client/cl_keys.c107
1 files changed, 67 insertions, 40 deletions
diff --git a/code/client/cl_keys.c b/code/client/cl_keys.c
index a518807..05d6a42 100644
--- a/code/client/cl_keys.c
+++ b/code/client/cl_keys.c
@@ -1372,8 +1372,10 @@ void Key_ClearStates (void)
}
// This must not exceed MAX_CMD_LINE
-#define MAX_CONSOLE_SAVE_BUFFER 1024
-static char consoleSaveBuffer[ MAX_CONSOLE_SAVE_BUFFER ];
+#define MAX_CONSOLE_SAVE_BUFFER 1024
+#define CONSOLE_HISTORY_FILE "q3history"
+static char consoleSaveBuffer[ MAX_CONSOLE_SAVE_BUFFER ];
+static int consoleSaveBufferSize = 0;
/*
================
@@ -1384,51 +1386,63 @@ Load the console history from cl_consoleHistory
*/
void CL_LoadConsoleHistory( void )
{
- char *token, *text_p;
- int i, numChars, numLines = 0;
- cvar_t *cv;
+ char *token, *text_p;
+ int i, numChars, numLines = 0;
+ fileHandle_t f;
- cv = Cvar_Get( "cl_consoleHistory", "", CVAR_ARCHIVE|CVAR_ROM );
- Q_strncpyz( consoleSaveBuffer, cv->string, MAX_CONSOLE_SAVE_BUFFER );
-
- text_p = consoleSaveBuffer;
+ consoleSaveBufferSize = FS_FOpenFileRead( CONSOLE_HISTORY_FILE, &f, qfalse );
+ if( !f )
+ {
+ Com_Printf( "Couldn't read %s.\n", CONSOLE_HISTORY_FILE );
+ return;
+ }
- for( i = COMMAND_HISTORY - 1; i >= 0; i-- )
+ if( consoleSaveBufferSize <= MAX_CONSOLE_SAVE_BUFFER &&
+ FS_Read( consoleSaveBuffer, consoleSaveBufferSize, f ) == consoleSaveBufferSize )
{
- if( !*( token = COM_Parse( &text_p ) ) )
- break;
+ text_p = consoleSaveBuffer;
+
+ for( i = COMMAND_HISTORY - 1; i >= 0; i-- )
+ {
+ if( !*( token = COM_Parse( &text_p ) ) )
+ break;
- historyEditLines[ i ].cursor = atoi( token );
+ historyEditLines[ i ].cursor = atoi( token );
- if( !*( token = COM_Parse( &text_p ) ) )
- break;
+ if( !*( token = COM_Parse( &text_p ) ) )
+ break;
- historyEditLines[ i ].scroll = atoi( token );
+ historyEditLines[ i ].scroll = atoi( token );
- if( !*( token = COM_Parse( &text_p ) ) )
- break;
+ if( !*( token = COM_Parse( &text_p ) ) )
+ break;
- numChars = atoi( token );
- text_p++;
- if( numChars > ( strlen( consoleSaveBuffer ) - ( text_p - consoleSaveBuffer ) ) )
- {
- Com_DPrintf( S_COLOR_YELLOW "WARNING: probable corrupt history\n" );
- break;
+ numChars = atoi( token );
+ text_p++;
+ if( numChars > ( strlen( consoleSaveBuffer ) - ( text_p - consoleSaveBuffer ) ) )
+ {
+ Com_DPrintf( S_COLOR_YELLOW "WARNING: probable corrupt history\n" );
+ break;
+ }
+ Com_Memcpy( historyEditLines[ i ].buffer,
+ text_p, numChars );
+ historyEditLines[ i ].buffer[ numChars ] = '\0';
+ text_p += numChars;
+
+ numLines++;
}
- Com_Memcpy( historyEditLines[ i ].buffer,
- text_p, numChars );
- historyEditLines[ i ].buffer[ numChars ] = '\0';
- text_p += numChars;
- numLines++;
- }
+ memmove( &historyEditLines[ 0 ], &historyEditLines[ i + 1 ],
+ numLines * sizeof( field_t ) );
+ for( i = numLines; i < COMMAND_HISTORY; i++ )
+ Field_Clear( &historyEditLines[ i ] );
- memmove( &historyEditLines[ 0 ], &historyEditLines[ i + 1 ],
- numLines * sizeof( field_t ) );
- for( i = numLines; i < COMMAND_HISTORY; i++ )
- Field_Clear( &historyEditLines[ i ] );
+ historyLine = nextHistoryLine = numLines;
+ }
+ else
+ Com_Printf( "Couldn't read %s.\n", CONSOLE_HISTORY_FILE );
- historyLine = nextHistoryLine = numLines;
+ FS_FCloseFile( f );
}
/*
@@ -1441,8 +1455,9 @@ so that it persists across invocations of q3
*/
void CL_SaveConsoleHistory( void )
{
- int i;
- int lineLength, saveBufferLength, additionalLength;
+ int i;
+ int lineLength, saveBufferLength, additionalLength;
+ fileHandle_t f;
consoleSaveBuffer[ 0 ] = '\0';
@@ -1454,8 +1469,8 @@ void CL_SaveConsoleHistory( void )
lineLength = strlen( historyEditLines[ i ].buffer );
saveBufferLength = strlen( consoleSaveBuffer );
- //ICK "seta cl_consoleHistory " + "%d %d %d " = 23 + 13 = 36
- additionalLength = lineLength + 36;
+ //ICK
+ additionalLength = lineLength + strlen( "999 999 999 " );
if( saveBufferLength + additionalLength < MAX_CONSOLE_SAVE_BUFFER )
{
@@ -1473,5 +1488,17 @@ void CL_SaveConsoleHistory( void )
}
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 );
}