Skip to content

Commit

Permalink
qcommon: Fix VMs being able to change CVAR_PROTECTED cvars
Browse files Browse the repository at this point in the history
VM could use Cvar_Register to set a protected cvar as user created and
was then able to use Cvar_Register with CVAR_ROM to change the value.

Don't allow Cvar_Register to affect protected cvars and prevent VMs
from adding internal flags to any cvars (creator, modified, protected,
nonexistent).

Reported by Noah Metzger (Chomenor).
  • Loading branch information
zturtleman authored and IR4T4 committed Feb 4, 2018
1 parent fdf8cb9 commit 850f9c7
Showing 1 changed file with 40 additions and 1 deletion.
41 changes: 40 additions & 1 deletion src/qcommon/cvar.c
Original file line number Diff line number Diff line change
Expand Up @@ -1693,7 +1693,46 @@ void Cvar_Register(vmCvar_t *vmCvar, const char *varName, const char *defaultVal
return;
}

cv = Cvar_Get(varName, defaultValue, flags | CVAR_VM_CREATED);
// Don't allow VM to specific a different creator or other internal flags.
if (flags & CVAR_USER_CREATED)
{
Com_Printf(S_COLOR_YELLOW "WARNING: VM tried to set CVAR_USER_CREATED on cvar '%s'\n", varName);
flags &= ~CVAR_USER_CREATED;
}
if (flags & CVAR_SERVER_CREATED)
{
Com_Printf(S_COLOR_YELLOW "WARNING: VM tried to set CVAR_SERVER_CREATED on cvar '%s'\n", varName);
flags &= ~CVAR_SERVER_CREATED;
}
if (flags & CVAR_PROTECTED)
{
Com_Printf(S_COLOR_YELLOW "WARNING: VM tried to set CVAR_PROTECTED on cvar '%s'\n", varName);
flags &= ~CVAR_PROTECTED;
}
if (flags & CVAR_MODIFIED)
{
Com_Printf(S_COLOR_YELLOW "WARNING: VM tried to set CVAR_MODIFIED on cvar '%s'\n", varName);
flags &= ~CVAR_MODIFIED;
}
if (flags & CVAR_NONEXISTENT)
{
Com_Printf(S_COLOR_YELLOW "WARNING: VM tried to set CVAR_NONEXISTENT on cvar '%s'\n", varName);
flags &= ~CVAR_NONEXISTENT;
}

cv = Cvar_FindVar(varName);

// Don't modify cvar if it's protected.
if (cv && (cv->flags & CVAR_PROTECTED))
{
Com_Printf(S_COLOR_YELLOW "WARNING: VM tried to register protected cvar '%s' with value '%s'%s\n",
varName, defaultValue, (flags & ~cv->flags ) != 0 ? " and new flags" : "" );
}
else
{
cv = Cvar_Get(varName, defaultValue, flags | CVAR_VM_CREATED);
}

if (!vmCvar)
{
return;
Expand Down

0 comments on commit 850f9c7

Please sign in to comment.