]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cvar.c
Call cvar callbacks after the cvar is set. Potentially fixes heap corruption.
[xonotic/darkplaces.git] / cvar.c
diff --git a/cvar.c b/cvar.c
index bcd4763fed5822ee5e65ec7da3bca5f30936d876..1b7bc874609c52f97c9ecf5288163b75fde4668d 100644 (file)
--- a/cvar.c
+++ b/cvar.c
@@ -375,28 +375,21 @@ static void Cvar_SetQuick_Internal (cvar_t *var, const char *value)
 {
        qboolean changed;
        size_t valuelen;
-       char new_value[MAX_INPUTLINE];
 
        changed = strcmp(var->string, value) != 0;
        // LadyHavoc: don't reallocate when there is no change
        if (!changed)
                return;
 
-       memcpy(new_value,value,MAX_INPUTLINE);
-
-       // Call the function stored in the cvar for bounds checking, cleanup, etc
-       if (var->callback)
-               var->callback(new_value);
-
        // LadyHavoc: don't reallocate when the buffer is the same size
-       valuelen = strlen(new_value);
+       valuelen = strlen(value);
        if (!var->string || strlen(var->string) != valuelen)
        {
                Z_Free ((char *)var->string);   // free the old value string
 
                var->string = (char *)Z_Malloc (valuelen + 1);
        }
-       memcpy ((char *)var->string, new_value, valuelen + 1);
+       memcpy ((char *)var->string, value, valuelen + 1);
        var->value = atof (var->string);
        var->integer = (int) var->value;
        if ((var->flags & CVAR_NOTIFY) && changed && sv.active && !sv_disablenotify.integer)
@@ -418,6 +411,10 @@ static void Cvar_SetQuick_Internal (cvar_t *var, const char *value)
                CL_SetInfo(var->name, var->string, true, false, false, false);
 
        Cvar_UpdateAutoCvar(var);
+
+       // Call the function stored in the cvar for bounds checking, cleanup, etc
+       if (var->callback)
+               var->callback(var);
 }
 
 void Cvar_SetQuick (cvar_t *var, const char *value)
@@ -448,7 +445,7 @@ void Cvar_Set(cvar_state_t *cvars, const char *var_name, const char *value)
 
 void Cvar_Set_NoCallback(cvar_t *var, const char *value)
 {
-       void (*callback_save)(char *) = var->callback;
+       void (*callback_save)(cvar_t *) = var->callback;
        var->callback = NULL;
        Cvar_SetQuick_Internal(var, value);
        var->callback = callback_save;
@@ -481,7 +478,7 @@ void Cvar_SetValue(cvar_state_t *cvars, const char *var_name, float value)
        Cvar_Set(cvars, var_name, val);
 }
 
-void Cvar_RegisterCallback(cvar_t *variable, void (*callback)(char *))
+void Cvar_RegisterCallback(cvar_t *variable, void (*callback)(cvar_t *))
 {
        variable->callback = callback;
 }