diff options
author | Andrey Nazarov <skuller@skuller.net> | 2009-09-05 12:34:05 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2009-09-05 12:34:05 +0000 |
commit | c1df6019baf94cdec6b1404de69fafce12aa26a4 (patch) | |
tree | 340ff19edbd6c30e76f70c13303e6859833f3bb7 | |
parent | f1d3a7ffd40a0e6768b220cf76d05db3c57c3e89 (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.c | 24 | ||||
-rw-r--r-- | source/q_shared.c | 33 | ||||
-rw-r--r-- | source/q_shared.h | 2 |
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 ); |