Guest

Untitled

By: a guest on Jan 27th, 2009  |  syntax: None  |  size: 2.19 KB  |  hits: 262  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  1. --- trunk/code/game/g_cmds.c    2009/01/13 07:57:03     1492
  2. +++ trunk/code/game/g_cmds.c    2009/01/17 23:09:58     1493
  3.  -1213,6 +1213,7 @@
  4.  ==================
  5.  */
  6.  void Cmd_CallVote_f( gentity_t *ent ) {
  7. +       char*   c;
  8.         int             i;
  9.         char    arg1[MAX_STRING_TOKENS];
  10.         char    arg2[MAX_STRING_TOKENS];
  11.  -1239,9 +1240,16 @@
  12.         trap_Argv( 1, arg1, sizeof( arg1 ) );
  13.         trap_Argv( 2, arg2, sizeof( arg2 ) );
  14.  
  15. -       if( strchr( arg1, ';' ) || strchr( arg2, ';' ) ) {
  16. -               trap_SendServerCommand( ent-g_entities, "print \"Invalid vote string.\n\"" );
  17. -               return;
  18. +       // check for command separators in arg2
  19. +       for( c = arg2; *c; ++c) {
  20. +               switch(*c) {
  21. +                       case '\n':
  22. +                       case '\r':
  23. +                       case ';':
  24. +                               trap_SendServerCommand( ent-g_entities, "print \"Invalid vote string.\n\"" );
  25. +                               return;
  26. +                       break;
  27. +               }
  28.         }
  29.  
  30.         if ( !Q_stricmp( arg1, "map_restart" ) ) {
  31.  
  32. --- trunk/code/qcommon/cmd.c    2009/01/13 07:57:03     1492
  33. +++ trunk/code/qcommon/cmd.c    2009/01/17 23:09:58     1493
  34.  -434,6 +434,22 @@
  35.  }
  36.  
  37.  /*
  38. +   Replace command separators with space to prevent interpretation
  39. +   This is a hack to protect buggy qvms
  40. +   https://bugzilla.icculus.org/show_bug.cgi?id=3593
  41. +*/
  42. +void Cmd_Args_Sanitize( void ) {
  43. +       int i;
  44. +       for ( i = 1 ; i < cmd_argc ; i++ ) {
  45. +               char* c = cmd_argv[i];
  46. +               while ((c = strpbrk(c, "\n\r;"))) {
  47. +                       *c = ' ';
  48. +                       ++c;
  49. +               }
  50. +       }
  51. +}
  52. +
  53. +/*
  54.  ============
  55.  Cmd_TokenizeString
  56.  
  57. --- trunk/code/qcommon/qcommon.h        2009/01/13 07:57:03     1492
  58. +++ trunk/code/qcommon/qcommon.h        2009/01/17 23:09:58     1493
  59.  -434,6 +434,7 @@
  60.  char   *Cmd_ArgsFrom( int arg );
  61.  void   Cmd_ArgsBuffer( char *buffer, int bufferLength );
  62.  char   *Cmd_Cmd (void);
  63. +void   Cmd_Args_Sanitize( void );
  64.  // The functions that execute commands get their parameters with these
  65.  // functions. Cmd_Argv () will return an empty string, not a NULL
  66.  // if arg > argc, so string operations are allways safe.
  67.  
  68. --- trunk/code/server/sv_client.c       2009/01/13 07:57:03     1492
  69. +++ trunk/code/server/sv_client.c       2009/01/17 23:09:58     1493
  70.  -1500,6 +1500,7 @@
  71.         if (clientOK) {
  72.                 // pass unknown strings to the game
  73.                 if (!u->name && sv.state == SS_GAME) {
  74. +                       Cmd_Args_Sanitize();
  75.                         VM_Call( gvm, GAME_CLIENT_COMMAND, cl - svs.clients );
  76.                 }
  77.         }