diff options
author | Chris Robinson <[email protected]> | 2012-10-14 00:55:46 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2012-10-14 00:55:46 -0700 |
commit | 20ede6de590223dcf2431799d25db5ff0c9404d8 (patch) | |
tree | f24566e43ad3581cbd7d3cd962bec7d5900d1705 | |
parent | 5c70e6b9abb65d31f68cf87cecd656af42ba0465 (diff) |
Check i64 property ranges before passing them to the int handlers
Note that some properties (e.g. AL_BUFFER, AL_DIRECT_FILTER) actually take
unsigned int values, and so are checked against the unsigned range even though
they eventually get casted to an int. The int handler casts them back as
needed.
-rw-r--r-- | OpenAL32/alSource.c | 95 |
1 files changed, 76 insertions, 19 deletions
diff --git a/OpenAL32/alSource.c b/OpenAL32/alSource.c index d5a38c3a..5350ca75 100644 --- a/OpenAL32/alSource.c +++ b/OpenAL32/alSource.c @@ -1271,7 +1271,6 @@ AL_API ALvoid AL_APIENTRY alSourcei64SOFT(ALuint source, ALenum param, ALint64SO { ALCcontext *Context; ALsource *Source; - ALint ival; Context = GetContextRef(); if(!Context) return; @@ -1287,19 +1286,33 @@ AL_API ALvoid AL_APIENTRY alSourcei64SOFT(ALuint source, ALenum param, ALint64SO case AL_REFERENCE_DISTANCE: case AL_SOURCE_RELATIVE: case AL_LOOPING: - case AL_BUFFER: case AL_SOURCE_STATE: case AL_SEC_OFFSET: case AL_SAMPLE_OFFSET: case AL_BYTE_OFFSET: - case AL_DIRECT_FILTER: case AL_DIRECT_FILTER_GAINHF_AUTO: case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: case AL_DIRECT_CHANNELS_SOFT: case AL_DISTANCE_MODEL: - ival = value; - SetSourceiv(Source, Context, param, &ival); + if(!(value <= INT_MAX && value >= INT_MIN)) + alSetError(Context, AL_INVALID_VALUE); + else + { + ALint ival = value; + SetSourceiv(Source, Context, param, &ival); + } + break; + + case AL_BUFFER: + case AL_DIRECT_FILTER: + if(!(value <= UINT_MAX && value >= 0)) + alSetError(Context, AL_INVALID_VALUE); + else + { + ALint ival = value; + SetSourceiv(Source, Context, param, &ival); + } break; default: @@ -1313,7 +1326,6 @@ AL_API void AL_APIENTRY alSource3i64SOFT(ALuint source, ALenum param, ALint64SOF { ALCcontext *Context; ALsource *Source; - ALint ivals[3]; Context = GetContextRef(); if(!Context) return; @@ -1325,11 +1337,27 @@ AL_API void AL_APIENTRY alSource3i64SOFT(ALuint source, ALenum param, ALint64SOF case AL_POSITION: case AL_VELOCITY: case AL_DIRECTION: + if(!(value1 <= INT_MAX && value1 >= INT_MIN && + value2 <= INT_MAX && value2 >= INT_MIN && + value3 <= INT_MAX && value3 >= INT_MIN)) + alSetError(Context, AL_INVALID_VALUE); + else + { + ALint ivals[3] = { value1, value2, value3 }; + SetSourceiv(Source, Context, param, ivals); + } + break; + case AL_AUXILIARY_SEND_FILTER: - ivals[0] = value1; - ivals[1] = value2; - ivals[2] = value3; - SetSourceiv(Source, Context, param, ivals); + if(!(value1 <= UINT_MAX && value1 >= 0 && + value2 <= UINT_MAX && value2 >= 0 && + value3 <= UINT_MAX && value3 >= 0)) + alSetError(Context, AL_INVALID_VALUE); + else + { + ALint ivals[3] = { value1, value2, value3 }; + SetSourceiv(Source, Context, param, ivals); + } break; default: @@ -1343,7 +1371,6 @@ AL_API void AL_APIENTRY alSourcei64vSOFT(ALuint source, ALenum param, const ALin { ALCcontext *Context; ALsource *Source; - ALint ivals[3]; Context = GetContextRef(); if(!Context) return; @@ -1358,7 +1385,6 @@ AL_API void AL_APIENTRY alSourcei64vSOFT(ALuint source, ALenum param, const ALin case AL_CONE_INNER_ANGLE: case AL_CONE_OUTER_ANGLE: case AL_LOOPING: - case AL_BUFFER: case AL_SOURCE_STATE: case AL_SEC_OFFSET: case AL_SAMPLE_OFFSET: @@ -1366,24 +1392,55 @@ AL_API void AL_APIENTRY alSourcei64vSOFT(ALuint source, ALenum param, const ALin case AL_MAX_DISTANCE: case AL_ROLLOFF_FACTOR: case AL_REFERENCE_DISTANCE: - case AL_DIRECT_FILTER: case AL_DIRECT_FILTER_GAINHF_AUTO: case AL_AUXILIARY_SEND_FILTER_GAIN_AUTO: case AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO: case AL_DISTANCE_MODEL: case AL_DIRECT_CHANNELS_SOFT: - ivals[0] = values[0]; - SetSourceiv(Source, Context, param, ivals); + if(!(values[0] <= INT_MAX && values[0] >= INT_MIN)) + alSetError(Context, AL_INVALID_VALUE); + else + { + ALint ival = values[0]; + SetSourceiv(Source, Context, param, &ival); + } + break; + + case AL_BUFFER: + case AL_DIRECT_FILTER: + if(!(values[0] <= UINT_MAX && values[0] >= 0)) + alSetError(Context, AL_INVALID_VALUE); + else + { + ALint ival = values[0]; + SetSourceiv(Source, Context, param, &ival); + } break; case AL_POSITION: case AL_VELOCITY: case AL_DIRECTION: + if(!(values[0] <= INT_MAX && values[0] >= INT_MIN && + values[1] <= INT_MAX && values[1] >= INT_MIN && + values[2] <= INT_MAX && values[2] >= INT_MIN)) + alSetError(Context, AL_INVALID_VALUE); + else + { + ALint ivals[3] = { values[0], values[1], values[2] }; + SetSourceiv(Source, Context, param, ivals); + } + break; + case AL_AUXILIARY_SEND_FILTER: - ivals[0] = values[0]; - ivals[1] = values[1]; - ivals[2] = values[2]; - SetSourceiv(Source, Context, param, ivals); + if(!(values[0] <= UINT_MAX && values[0] >= 0 && + values[1] <= UINT_MAX && values[1] >= 0 && + values[2] <= UINT_MAX && values[2] >= 0)) + alSetError(Context, AL_INVALID_VALUE); + else + { + ALint ivals[3] = { values[0], values[1], values[2] }; + SetSourceiv(Source, Context, param, ivals); + } break; default: |