Module: wine Branch: master Commit: 6cb430102117b21fa96009c774af9e5c99e61777 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6cb430102117b21fa96009c774...
Author: Rico Schüller kgbricola@web.de Date: Mon Jan 7 21:57:18 2013 +0100
d3dx9: Handle invalid byte code in D3DXGetShaderConstantTableEx().
---
dlls/d3dx9_36/shader.c | 6 ++++++ dlls/d3dx9_36/tests/shader.c | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c index e266fe2..81c8323 100644 --- a/dlls/d3dx9_36/shader.c +++ b/dlls/d3dx9_36/shader.c @@ -1639,6 +1639,12 @@ HRESULT WINAPI D3DXGetShaderConstantTableEx(const DWORD *byte_code, DWORD flags, return D3DERR_INVALIDCALL; }
+ if (!is_valid_bytecode(*byte_code)) + { + WARN("Invalid byte_code specified.\n"); + return D3D_OK; + } + if (flags) FIXME("Flags (%#x) are not handled, yet!\n", flags);
hr = D3DXFindShaderComment(byte_code, MAKEFOURCC('C','T','A','B'), &data, &size); diff --git a/dlls/d3dx9_36/tests/shader.c b/dlls/d3dx9_36/tests/shader.c index fb8f270..f7be174 100644 --- a/dlls/d3dx9_36/tests/shader.c +++ b/dlls/d3dx9_36/tests/shader.c @@ -366,6 +366,21 @@ static void test_get_shader_constant_table_ex(void) ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table);
+ constant_table = (ID3DXConstantTable *)0xdeadbeef; + hr = D3DXGetShaderConstantTableEx(shader_zero, 0, &constant_table); + ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK); + ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table); + + constant_table = (ID3DXConstantTable *)0xdeadbeef; + hr = D3DXGetShaderConstantTableEx(shader_invalid, 0, &constant_table); + ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK); + ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table); + + constant_table = (ID3DXConstantTable *)0xdeadbeef; + hr = D3DXGetShaderConstantTableEx(shader_empty, 0, &constant_table); + ok(hr == D3DXERR_INVALIDDATA, "Got result %x, expected %x (D3DXERR_INVALIDDATA)\n", hr, D3DXERR_INVALIDDATA); + ok(constant_table == NULL, "D3DXGetShaderConstantTableEx() failed, got %p\n", constant_table); + /* No CTAB data */ constant_table = (ID3DXConstantTable *)0xdeadbeef; hr = D3DXGetShaderConstantTableEx(simple_ps, 0, &constant_table);