X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=cmd.c;h=b6436b3842cafa12786b1caf793fdf9c4c8c7764;hp=fdd51bba4a590187400c770c916fbf189cc4432d;hb=af0b7a1fa11c2ceedeb9f66ca950f6c0bff8ad8f;hpb=57252d1b300d96b2353bf9d564b0de281552d2c5 diff --git a/cmd.c b/cmd.c index fdd51bba..b6436b38 100644 --- a/cmd.c +++ b/cmd.c @@ -36,6 +36,10 @@ static qboolean cmd_wait; static mempool_t *cmd_mempool; +#define CMD_TOKENIZELENGTH 4096 +static char cmd_tokenizebuffer[CMD_TOKENIZELENGTH]; +static int cmd_tokenizebufferpos = 0; + //============================================================================= /* @@ -145,6 +149,9 @@ void Cbuf_Execute (void) char line[1024]; int quotes; + // LordHavoc: making sure the tokenizebuffer doesn't get filled up by repeated crashes + cmd_tokenizebufferpos = 0; + while (cmd_text.cursize) { // find a \n or ; line break @@ -293,7 +300,7 @@ static void Cmd_Exec_f (void) Con_Printf ("couldn't exec %s\n",Cmd_Argv(1)); return; } - Con_Printf ("execing %s\n",Cmd_Argv(1)); + Con_DPrintf ("execing %s\n",Cmd_Argv(1)); Cbuf_InsertText (f); Mem_Free(f); @@ -370,18 +377,18 @@ static void Cmd_Alias_f (void) a->next = cmd_alias; cmd_alias = a; } - strcpy (a->name, s); + strlcpy (a->name, s, sizeof (a->name)); // copy the rest of the command line cmd[0] = 0; // start out with a null string c = Cmd_Argc(); for (i=2 ; i< c ; i++) { - strcat (cmd, Cmd_Argv(i)); + strlcat (cmd, Cmd_Argv(i), sizeof (cmd)); if (i != c) - strcat (cmd, " "); + strlcat (cmd, " ", sizeof (cmd)); } - strcat (cmd, "\n"); + strlcat (cmd, "\n", sizeof (cmd)); a->value = CopyString (cmd); } @@ -512,9 +519,6 @@ const char *Cmd_Args (void) } -#define CMD_TOKENIZELENGTH 4096 -char cmd_tokenizebuffer[CMD_TOKENIZELENGTH]; - /* ============ Cmd_TokenizeString @@ -525,22 +529,19 @@ Parses the given string into command line tokens. static void Cmd_TokenizeString (const char *text) { int l; - int pos; - pos = 0; cmd_argc = 0; cmd_args = NULL; while (1) { -// skip whitespace up to a /n + // skip whitespace up to a /n while (*text && *text <= ' ' && *text != '\n') - { text++; - } if (*text == '\n') - { // a newline seperates commands in the buffer + { + // a newline seperates commands in the buffer text++; break; } @@ -551,17 +552,17 @@ static void Cmd_TokenizeString (const char *text) if (cmd_argc == 1) cmd_args = text; - if (!COM_ParseToken (&text)) + if (!COM_ParseToken(&text, false)) return; if (cmd_argc < MAX_ARGS) { l = strlen(com_token) + 1; - if (pos + l > CMD_TOKENIZELENGTH) + if (cmd_tokenizebufferpos + l > CMD_TOKENIZELENGTH) Sys_Error("Cmd_TokenizeString: ran out of %i character buffer space for command arguements\n", CMD_TOKENIZELENGTH); - strcpy (cmd_tokenizebuffer + pos, com_token); - cmd_argv[cmd_argc] = cmd_tokenizebuffer + pos; - pos += l; + strcpy (cmd_tokenizebuffer + cmd_tokenizebufferpos, com_token); + cmd_argv[cmd_argc] = cmd_tokenizebuffer + cmd_tokenizebufferpos; + cmd_tokenizebufferpos += l; cmd_argc++; } } @@ -793,15 +794,20 @@ FIXME: lookupnoadd the token to speed search? */ void Cmd_ExecuteString (const char *text, cmd_source_t src) { + int oldpos; cmd_function_t *cmd; cmdalias_t *a; + oldpos = cmd_tokenizebufferpos; cmd_source = src; Cmd_TokenizeString (text); // execute the command line if (!Cmd_Argc()) + { + cmd_tokenizebufferpos = oldpos; return; // no tokens + } // check functions for (cmd=cmd_functions ; cmd ; cmd=cmd->next) @@ -809,6 +815,7 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src) if (!strcasecmp (cmd_argv[0],cmd->name)) { cmd->function (); + cmd_tokenizebufferpos = oldpos; return; } } @@ -819,6 +826,7 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src) if (!strcasecmp (cmd_argv[0], a->name)) { Cbuf_InsertText (a->value); + cmd_tokenizebufferpos = oldpos; return; } } @@ -826,6 +834,8 @@ void Cmd_ExecuteString (const char *text, cmd_source_t src) // check cvars if (!Cvar_Command ()) Con_Printf ("Unknown command \"%s\"\n", Cmd_Argv(0)); + + cmd_tokenizebufferpos = oldpos; }