]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cmd.c
Lots of str[n]cat, str[n]cpy, and [v]sprintf have been replaced by strlcat, strlcpy...
[xonotic/darkplaces.git] / cmd.c
diff --git a/cmd.c b/cmd.c
index fdd51bba4a590187400c770c916fbf189cc4432d..b6436b3842cafa12786b1caf793fdf9c4c8c7764 100644 (file)
--- 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;
 }