(#3767) Some protection from malicious qvms - patches and ideas by Amanieu d'Antras and Ben Millwood
This commit is contained in:
parent
657c791257
commit
8c3f320504
12 changed files with 155 additions and 26 deletions
|
@ -588,6 +588,20 @@ void Cmd_TokenizeStringIgnoreQuotes( const char *text_in ) {
|
|||
Cmd_TokenizeString2( text_in, qtrue );
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_FindCommand
|
||||
============
|
||||
*/
|
||||
cmd_function_t *Cmd_FindCommand( const char *cmd_name )
|
||||
{
|
||||
cmd_function_t *cmd;
|
||||
for( cmd = cmd_functions; cmd; cmd = cmd->next )
|
||||
if( !Q_stricmp( cmd_name, cmd->name ) )
|
||||
return cmd;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_AddCommand
|
||||
|
@ -597,14 +611,12 @@ void Cmd_AddCommand( const char *cmd_name, xcommand_t function ) {
|
|||
cmd_function_t *cmd;
|
||||
|
||||
// fail if the command already exists
|
||||
for ( cmd = cmd_functions ; cmd ; cmd=cmd->next ) {
|
||||
if ( !strcmp( cmd_name, cmd->name ) ) {
|
||||
// allow completion-only commands to be silently doubled
|
||||
if ( function != NULL ) {
|
||||
Com_Printf ("Cmd_AddCommand: %s already defined\n", cmd_name);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if( Cmd_FindCommand( cmd_name ) )
|
||||
{
|
||||
// allow completion-only commands to be silently doubled
|
||||
if( function != NULL )
|
||||
Com_Printf( "Cmd_AddCommand: %s already defined\n", cmd_name );
|
||||
return;
|
||||
}
|
||||
|
||||
// use a small malloc to avoid zone fragmentation
|
||||
|
@ -658,6 +670,28 @@ void Cmd_RemoveCommand( const char *cmd_name ) {
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
Cmd_RemoveCommandSafe
|
||||
|
||||
Only remove commands with no associated function
|
||||
============
|
||||
*/
|
||||
void Cmd_RemoveCommandSafe( const char *cmd_name )
|
||||
{
|
||||
cmd_function_t *cmd = Cmd_FindCommand( cmd_name );
|
||||
|
||||
if( !cmd )
|
||||
return;
|
||||
if( cmd->function )
|
||||
{
|
||||
Com_Error( ERR_DROP, "Restricted source tried to remove "
|
||||
"system command \"%s\"\n", cmd_name );
|
||||
return;
|
||||
}
|
||||
|
||||
Cmd_RemoveCommand( cmd_name );
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue