mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-29 20:20:43 +00:00
fix some nasty security holes causes by oversized connection strings. slows
down overkill slightly :/
This commit is contained in:
parent
20690b71e0
commit
650d682d2c
4 changed files with 43 additions and 22 deletions
|
@ -144,8 +144,7 @@ void Cmd_StuffCmds_f (void);
|
||||||
void Cbuf_Execute_Sets (void);
|
void Cbuf_Execute_Sets (void);
|
||||||
void Cmd_Exec_File (const char *path);
|
void Cmd_Exec_File (const char *path);
|
||||||
|
|
||||||
#define MAX_COM_TOKEN 1024
|
extern char *com_token;
|
||||||
extern char com_token[MAX_COM_TOKEN];
|
|
||||||
const char *COM_Parse (const char *data);
|
const char *COM_Parse (const char *data);
|
||||||
|
|
||||||
void Cmd_ParseSpecial (char *s);
|
void Cmd_ParseSpecial (char *s);
|
||||||
|
|
|
@ -477,8 +477,18 @@ Cmd_Args (int start)
|
||||||
void
|
void
|
||||||
Cmd_TokenizeString (const char *text)
|
Cmd_TokenizeString (const char *text)
|
||||||
{
|
{
|
||||||
static char argv_buf[1024];
|
static char *argv_buf;
|
||||||
|
static size_t argv_buf_size;
|
||||||
int argv_idx;
|
int argv_idx;
|
||||||
|
size_t len = strlen (text) + 1;
|
||||||
|
|
||||||
|
if (len > argv_buf_size) {
|
||||||
|
argv_buf_size = (len + 1023) & ~1023;
|
||||||
|
argv_buf = realloc (argv_buf, argv_buf_size);
|
||||||
|
if (!argv_buf)
|
||||||
|
Sys_Error ("Cmd_TokenizeString: could not allocate %d bytes",
|
||||||
|
argv_buf_size);
|
||||||
|
}
|
||||||
|
|
||||||
argv_idx = 0;
|
argv_idx = 0;
|
||||||
|
|
||||||
|
@ -508,10 +518,6 @@ Cmd_TokenizeString (const char *text)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (cmd_argc < MAX_ARGS) {
|
if (cmd_argc < MAX_ARGS) {
|
||||||
if (argv_idx + strlen (com_token) + 1 > MAX_COM_TOKEN) {
|
|
||||||
Sys_Printf ("Cmd_TokenizeString: overflow\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
cmd_argv[cmd_argc] = argv_buf + argv_idx;
|
cmd_argv[cmd_argc] = argv_buf + argv_idx;
|
||||||
strcpy (cmd_argv[cmd_argc], com_token);
|
strcpy (cmd_argv[cmd_argc], com_token);
|
||||||
argv_idx += strlen (com_token) + 1;
|
argv_idx += strlen (com_token) + 1;
|
||||||
|
@ -1024,7 +1030,24 @@ Cmd_Init (void)
|
||||||
"the documentation for details.");
|
"the documentation for details.");
|
||||||
}
|
}
|
||||||
|
|
||||||
char com_token[MAX_COM_TOKEN];
|
char *com_token;
|
||||||
|
static size_t com_token_size;
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
write_com_token (size_t pos, char c)
|
||||||
|
{
|
||||||
|
if (pos + 1 <= com_token_size) {
|
||||||
|
write:
|
||||||
|
com_token[pos] = c;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
com_token_size = (pos + 1024) & ~1023;
|
||||||
|
com_token = realloc (com_token, com_token_size);
|
||||||
|
if (!com_token)
|
||||||
|
Sys_Error ("COM_Parse: could not allocate %d bytes",
|
||||||
|
com_token_size);
|
||||||
|
goto write;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
COM_Parse
|
COM_Parse
|
||||||
|
@ -1032,13 +1055,13 @@ char com_token[MAX_COM_TOKEN];
|
||||||
Parse a token out of a string
|
Parse a token out of a string
|
||||||
*/
|
*/
|
||||||
const char *
|
const char *
|
||||||
COM_Parse (const char *data)
|
COM_Parse (const char *_data)
|
||||||
{
|
{
|
||||||
|
const byte *data = (const byte *)_data;
|
||||||
unsigned int c;
|
unsigned int c;
|
||||||
int len;
|
size_t len = 0;
|
||||||
|
|
||||||
len = 0;
|
write_com_token (len, 0);
|
||||||
com_token[0] = 0;
|
|
||||||
|
|
||||||
if (!data)
|
if (!data)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1064,25 +1087,23 @@ skipwhite:
|
||||||
while (1) {
|
while (1) {
|
||||||
c = *data++;
|
c = *data++;
|
||||||
if (c == '\"' || !c) {
|
if (c == '\"' || !c) {
|
||||||
com_token[len] = 0;
|
write_com_token (len, 0);
|
||||||
return data;
|
return c ? data : data - 1;
|
||||||
}
|
}
|
||||||
com_token[len] = c;
|
write_com_token (len, c);
|
||||||
len++;
|
len++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// parse a regular word
|
// parse a regular word
|
||||||
do {
|
do {
|
||||||
com_token[len] = c;
|
write_com_token (len, c);
|
||||||
data++;
|
data++;
|
||||||
len++;
|
len++;
|
||||||
if (len >= MAX_COM_TOKEN - 1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
c = *data;
|
c = *data;
|
||||||
} while (c > 32);
|
} while (c > 32);
|
||||||
|
|
||||||
com_token[len] = 0;
|
write_com_token (len, 0);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,6 @@ size_t
|
||||||
Q_strnlen (const char *s, size_t maxlen)
|
Q_strnlen (const char *s, size_t maxlen)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0; s[i] && i < maxlen; i++);
|
for (i = 0; i < maxlen && s[i]; i++);
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
|
@ -682,7 +682,7 @@ SVC_GetChallenge (void)
|
||||||
void
|
void
|
||||||
SVC_DirectConnect (void)
|
SVC_DirectConnect (void)
|
||||||
{
|
{
|
||||||
info_t *userinfo;
|
info_t *userinfo = 0;
|
||||||
const char *s;
|
const char *s;
|
||||||
client_t *cl, *newcl;
|
client_t *cl, *newcl;
|
||||||
client_t temp;
|
client_t temp;
|
||||||
|
@ -707,7 +707,8 @@ SVC_DirectConnect (void)
|
||||||
|
|
||||||
challenge = atoi (Cmd_Argv (3));
|
challenge = atoi (Cmd_Argv (3));
|
||||||
|
|
||||||
userinfo = Info_ParseString (Cmd_Argv (4), 1023);
|
if (strlen (Cmd_Argv (4)) < MAX_INFO_STRING)
|
||||||
|
userinfo = Info_ParseString (Cmd_Argv (4), 1023);
|
||||||
|
|
||||||
// Validate the userinfo string.
|
// Validate the userinfo string.
|
||||||
if (!userinfo) {
|
if (!userinfo) {
|
||||||
|
|
Loading…
Reference in a new issue