Rico Schüller : wined3d: Add argument check for Type to Get/SetTextureStageState().
Alexandre Julliard
julliard at winehq.org
Tue Sep 14 17:35:27 CDT 2010
Module: wine
Branch: master
Commit: e6d52c0c8bd7f70fd0046508e0e76c66b525daf5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e6d52c0c8bd7f70fd0046508e0e76c66b525daf5
Author: Rico Schüller <kgbricola at web.de>
Date: Sun Sep 12 10:34:20 2010 +0200
wined3d: Add argument check for Type to Get/SetTextureStageState().
---
dlls/d3d8/device.c | 26 ++++++++++++++++++++++----
dlls/d3d9/device.c | 18 ++++++++++++++++--
dlls/ddraw/device.c | 9 ++++++---
dlls/wined3d/device.c | 23 ++++++++++++++++++++---
4 files changed, 64 insertions(+), 12 deletions(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index c547da4..f54f043 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -1575,13 +1575,22 @@ tss_lookup[] =
{FALSE, WINED3DTSS_RESULTARG}, /* 28, D3DTSS_RESULTARG */
};
-static HRESULT WINAPI IDirect3DDevice8Impl_GetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD* pValue) {
+static HRESULT WINAPI IDirect3DDevice8Impl_GetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD *pValue)
+{
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
- const struct tss_lookup *l = &tss_lookup[Type];
+ const struct tss_lookup *l;
HRESULT hr;
TRACE("iface %p, stage %u, state %#x, value %p.\n", iface, Stage, Type, pValue);
+ if (Type >= sizeof(tss_lookup) / sizeof(*tss_lookup))
+ {
+ WARN("Invalid Type %#x passed.\n", Type);
+ return D3D_OK;
+ }
+
+ l = &tss_lookup[Type];
+
wined3d_mutex_lock();
if (l->sampler_state) hr = IWineD3DDevice_GetSamplerState(This->WineD3DDevice, Stage, l->state, pValue);
else hr = IWineD3DDevice_GetTextureStageState(This->WineD3DDevice, Stage, l->state, pValue);
@@ -1590,13 +1599,22 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetTextureStageState(LPDIRECT3DDEVI
return hr;
}
-static HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) {
+static HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value)
+{
IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface;
- const struct tss_lookup *l = &tss_lookup[Type];
+ const struct tss_lookup *l;
HRESULT hr;
TRACE("iface %p, stage %u, state %#x, value %#x.\n", iface, Stage, Type, Value);
+ if (Type >= sizeof(tss_lookup) / sizeof(*tss_lookup))
+ {
+ WARN("Invalid Type %#x passed.\n", Type);
+ return D3D_OK;
+ }
+
+ l = &tss_lookup[Type];
+
wined3d_mutex_lock();
if (l->sampler_state) hr = IWineD3DDevice_SetSamplerState(This->WineD3DDevice, Stage, l->state, Value);
else hr = IWineD3DDevice_SetTextureStageState(This->WineD3DDevice, Stage, l->state, Value);
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index af9cc48..c788b98 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -1681,12 +1681,19 @@ static const WINED3DTEXTURESTAGESTATETYPE tss_lookup[] =
WINED3DTSS_CONSTANT, /* 32, D3DTSS_CONSTANT */
};
-static HRESULT WINAPI IDirect3DDevice9Impl_GetTextureStageState(LPDIRECT3DDEVICE9EX iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD* pValue) {
+static HRESULT WINAPI IDirect3DDevice9Impl_GetTextureStageState(LPDIRECT3DDEVICE9EX iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD *pValue)
+{
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
TRACE("iface %p, stage %u, state %#x, value %p.\n", iface, Stage, Type, pValue);
+ if (Type >= sizeof(tss_lookup) / sizeof(*tss_lookup))
+ {
+ WARN("Invalid Type %#x passed.\n", Type);
+ return D3D_OK;
+ }
+
wined3d_mutex_lock();
hr = IWineD3DDevice_GetTextureStageState(This->WineD3DDevice, Stage, tss_lookup[Type], pValue);
wined3d_mutex_unlock();
@@ -1694,12 +1701,19 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetTextureStageState(LPDIRECT3DDEVI
return hr;
}
-static HRESULT WINAPI IDirect3DDevice9Impl_SetTextureStageState(LPDIRECT3DDEVICE9EX iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) {
+static HRESULT WINAPI IDirect3DDevice9Impl_SetTextureStageState(LPDIRECT3DDEVICE9EX iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value)
+{
IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
HRESULT hr;
TRACE("iface %p, stage %u, state %#x, value %#x.\n", iface, Stage, Type, Value);
+ if (Type >= sizeof(tss_lookup) / sizeof(*tss_lookup))
+ {
+ WARN("Invalid Type %#x passed.\n", Type);
+ return D3D_OK;
+ }
+
wined3d_mutex_lock();
hr = IWineD3DDevice_SetTextureStageState(This->WineD3DDevice, Stage, tss_lookup[Type], Value);
wined3d_mutex_unlock();
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 8e25543..30109e9 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -4870,7 +4870,7 @@ IDirect3DDeviceImpl_7_GetTextureStageState(IDirect3DDevice7 *iface,
{
IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
HRESULT hr;
- const struct tss_lookup *l = &tss_lookup[TexStageStateType];
+ const struct tss_lookup *l;
TRACE("iface %p, stage %u, state %#x, value %p.\n",
iface, Stage, TexStageStateType, State);
@@ -4881,10 +4881,11 @@ IDirect3DDeviceImpl_7_GetTextureStageState(IDirect3DDevice7 *iface,
if (TexStageStateType > D3DTSS_TEXTURETRANSFORMFLAGS)
{
WARN("Invalid TexStageStateType %#x passed.\n", TexStageStateType);
- *State = 0;
return DD_OK;
}
+ l = &tss_lookup[TexStageStateType];
+
EnterCriticalSection(&ddraw_cs);
if (l->sampler_state)
@@ -5003,7 +5004,7 @@ IDirect3DDeviceImpl_7_SetTextureStageState(IDirect3DDevice7 *iface,
DWORD State)
{
IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface;
- const struct tss_lookup *l = &tss_lookup[TexStageStateType];
+ const struct tss_lookup *l;
HRESULT hr;
TRACE("iface %p, stage %u, state %#x, value %#x.\n",
@@ -5015,6 +5016,8 @@ IDirect3DDeviceImpl_7_SetTextureStageState(IDirect3DDevice7 *iface,
return DD_OK;
}
+ l = &tss_lookup[TexStageStateType];
+
EnterCriticalSection(&ddraw_cs);
if (l->sampler_state)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 7c75309..0be7e03 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4199,13 +4199,20 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
* Get / Set Texture Stage States
* TODO: Verify against dx9 definitions
*****/
-static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD Value) {
+static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD Value)
+{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- DWORD oldValue = This->updateStateBlock->textureState[Stage][Type];
const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
+ DWORD oldValue;
TRACE("(%p) : Stage=%d, Type=%s(%d), Value=%d\n", This, Stage, debug_d3dtexturestate(Type), Type, Value);
+ if (Type > WINED3D_HIGHEST_TEXTURE_STATE)
+ {
+ WARN("Invalid Type %d passed.\n", Type);
+ return WINED3D_OK;
+ }
+
if (Stage >= gl_info->limits.texture_stages)
{
WARN("Attempting to set stage %u which is higher than the max stage %u, ignoring.\n",
@@ -4213,6 +4220,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *if
return WINED3D_OK;
}
+ oldValue = This->updateStateBlock->textureState[Stage][Type];
This->updateStateBlock->changed.textureState[Stage] |= 1 << Type;
This->updateStateBlock->textureState[Stage][Type] = Value;
@@ -4276,9 +4284,18 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *if
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DDeviceImpl_GetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD* pValue) {
+static HRESULT WINAPI IWineD3DDeviceImpl_GetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD *pValue)
+{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+
+ if (Type > WINED3D_HIGHEST_TEXTURE_STATE)
+ {
+ WARN("Invalid Type %d passed.\n", Type);
+ return WINED3D_OK;
+ }
+
TRACE("(%p) : requesting Stage %d, Type %d getting %d\n", This, Stage, Type, This->updateStateBlock->textureState[Stage][Type]);
+
*pValue = This->updateStateBlock->textureState[Stage][Type];
return WINED3D_OK;
}
More information about the wine-cvs
mailing list