summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2009-09-05 12:34:05 +0000
committerAndrey Nazarov <skuller@skuller.net>2009-09-05 12:34:05 +0000
commitc1df6019baf94cdec6b1404de69fafce12aa26a4 (patch)
tree340ff19edbd6c30e76f70c13303e6859833f3bb7
parentf1d3a7ffd40a0e6768b220cf76d05db3c57c3e89 (diff)
Changed return type of Info_SubValidate to size_t.
Print more informative warnings when attempting to set an invalid info cvar value.
-rw-r--r--source/cvar.c24
-rw-r--r--source/q_shared.c33
-rw-r--r--source/q_shared.h2
3 files changed, 36 insertions, 23 deletions
diff --git a/source/cvar.c b/source/cvar.c
index 966a0c4..e009e33 100644
--- a/source/cvar.c
+++ b/source/cvar.c
@@ -208,6 +208,21 @@ static void Cvar_EngineGet( cvar_t *var, const char *var_value, int flags ) {
var->flags |= flags;
}
+static qboolean validate_info_cvar( const char *s ) {
+ size_t len = Info_SubValidate( s );
+
+ if( len == SIZE_MAX ) {
+ Com_WPrintf( "Info cvars should not contain '\\', ';' or '\"' characters.\n" );
+ return qfalse;
+ }
+
+ if( len >= MAX_QPATH ) {
+ Com_WPrintf( "Info cvars should be less than 64 characters long.\n" );
+ return qfalse;
+ }
+
+ return qtrue;
+}
/*
============
@@ -230,12 +245,10 @@ cvar_t *Cvar_Get( const char *var_name, const char *var_value, int flags ) {
}
if( flags & CVAR_INFOMASK ) {
- if( Info_SubValidate( var_name ) == -1 ) {
- Com_WPrintf( "Invalid info cvar name '%s'.\n", var_name );
+ if( !validate_info_cvar( var_name ) ) {
return NULL;
}
- if( Info_SubValidate( var_value ) == -1 ) {
- Com_WPrintf( "Invalid info cvar value '%s' for '%s'.\n", var_value, var_name );
+ if( !validate_info_cvar( var_value ) ) {
return NULL;
}
}
@@ -303,8 +316,7 @@ void Cvar_SetByVar( cvar_t *var, const char *value, from_t from ) {
}
if( var->flags & CVAR_INFOMASK ) {
- if( Info_SubValidate( value ) == -1 ) {
- Com_WPrintf( "Invalid info cvar value '%s' for '%s'.\n", value, var->name );
+ if( !validate_info_cvar( value ) ) {
return;
}
}
diff --git a/source/q_shared.c b/source/q_shared.c
index 5019256..9a4aea0 100644
--- a/source/q_shared.c
+++ b/source/q_shared.c
@@ -1183,23 +1183,23 @@ qboolean Info_Validate( const char *s ) {
/*
============
-Info_ValidateSubstring
+Info_SubValidate
============
*/
-int Info_SubValidate( const char *s ) {
- const char *start;
- int c, len;
+size_t Info_SubValidate( const char *s ) {
+ size_t len;
+ int c;
- for( start = s; *s; s++ ) {
- c = *s & 127;
+ len = 0;
+ while( *s ) {
+ c = *s++;
+ c &= 127; // strip high bits
if( c == '\\' || c == '\"' || c == ';' ) {
- return -1;
+ return SIZE_MAX; // illegal characters
+ }
+ if( ++len == MAX_QPATH ) {
+ return MAX_QPATH; // oversize value
}
- }
-
- len = s - start;
- if( len >= MAX_QPATH ) {
- return -1;
}
return len;
@@ -1212,17 +1212,18 @@ Info_SetValueForKey
*/
qboolean Info_SetValueForKey( char *s, const char *key, const char *value ) {
char newi[MAX_INFO_STRING], *v;
- int c, l, kl, vl;
+ size_t l, kl, vl;
+ int c;
// validate key
kl = Info_SubValidate( key );
- if( kl == -1 ) {
+ if( kl >= MAX_QPATH ) {
return qfalse;
}
// validate value
vl = Info_SubValidate( value );
- if( vl == -1 ) {
+ if( vl >= MAX_QPATH ) {
return qfalse;
}
@@ -1231,7 +1232,7 @@ qboolean Info_SetValueForKey( char *s, const char *key, const char *value ) {
return qtrue;
}
- l = ( int )strlen( s );
+ l = strlen( s );
if( l + kl + vl + 2 >= MAX_INFO_STRING ) {
return qfalse;
}
diff --git a/source/q_shared.h b/source/q_shared.h
index d8cc113..4386632 100644
--- a/source/q_shared.h
+++ b/source/q_shared.h
@@ -549,7 +549,7 @@ char *Info_ValueForKey( const char *s, const char *key );
void Info_RemoveKey( char *s, const char *key );
qboolean Info_SetValueForKey( char *s, const char *key, const char *value );
qboolean Info_Validate( const char *s );
-int Info_SubValidate( const char *s );
+size_t Info_SubValidate( const char *s );
void Info_NextPair( const char **string, char *key, char *value );
void Info_Print( const char *infostring );