diff --git a/src/command.c b/src/command.c
index 58434ef8983a1a0ed1816a9522783214896351b1..f1bf7dfb52b3586763571b1276058f4dad19b0f1 100644
--- a/src/command.c
+++ b/src/command.c
@@ -1433,6 +1433,7 @@ static void Setvalue(consvar_t *var, const char *valstr, boolean stealth)
 						if (var->revert.allocated)
 						{
 							Z_Free(var->revert.v.string);
+							var->revert.allocated = false; // the below value is not allocated in zone memory, don't try to free it!
 						}
 
 						var->revert.v.const_munge = var->PossibleValue[i].strvalue;
@@ -1505,6 +1506,7 @@ found:
 				if (var->revert.allocated)
 				{
 					Z_Free(var->revert.v.string);
+					var->revert.allocated = false; // the below value is not allocated in zone memory, don't try to free it!
 				}
 
 				var->revert.v.const_munge = var->PossibleValue[i].strvalue;
@@ -1523,6 +1525,7 @@ found:
 		if (var->revert.allocated)
 		{
 			Z_Free(var->revert.v.string);
+			// Z_StrDup creates a new zone memory block, so we can keep the allocated flag on
 		}
 
 		var->revert.v.string = Z_StrDup(valstr);
@@ -1787,6 +1790,7 @@ void CV_RevertNetVars(void)
 			if (cvar->revert.allocated)
 			{
 				Z_Free(cvar->revert.v.string);
+				cvar->revert.allocated = false; // no value being held now
 			}
 
 			cvar->revert.v.string = NULL;