From f6907843385c01e58cdeb2d7701fdba085735d37 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Fri, 13 Oct 2023 01:12:52 +0200 Subject: [PATCH] d3dx9: Check for tx_1_0 blob magic earlier in D3DXCreateTextureShader(). Signed-off-by: Nikolay Sivov --- dlls/d3dx9_36/d3dx9_private.h | 2 ++ dlls/d3dx9_36/preshader.c | 1 - dlls/d3dx9_36/shader.c | 3 +++ dlls/d3dx9_36/tests/texture.c | 14 +++++++++++--- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/dlls/d3dx9_36/d3dx9_private.h b/dlls/d3dx9_36/d3dx9_private.h index 5d8f5b332f8..991ff5b79b5 100644 --- a/dlls/d3dx9_36/d3dx9_private.h +++ b/dlls/d3dx9_36/d3dx9_private.h @@ -32,6 +32,8 @@ #define ULONG64_MAX (~(ULONG64)0) +#define FOURCC_TX_1 0x54580100 + struct vec4 { float x, y, z, w; diff --git a/dlls/d3dx9_36/preshader.c b/dlls/d3dx9_36/preshader.c index ebf62a99c6a..14cc2e234f4 100644 --- a/dlls/d3dx9_36/preshader.c +++ b/dlls/d3dx9_36/preshader.c @@ -144,7 +144,6 @@ static double pres_div(double *args, int n) {return 0.0;} #define FOURCC_CLIT 0x54494c43 #define FOURCC_FXLC 0x434c5846 #define FOURCC_PRSI 0x49535250 -#define FOURCC_TX_1 0x54580100 #define PRES_SIGN 0x46580000 struct op_info diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c index 7d06090aa15..f31a609ab04 100644 --- a/dlls/d3dx9_36/shader.c +++ b/dlls/d3dx9_36/shader.c @@ -2653,6 +2653,9 @@ HRESULT WINAPI D3DXCreateTextureShader(const DWORD *function, ID3DXTextureShader if (!function || !texture_shader) return D3DERR_INVALIDCALL; + if (*function != FOURCC_TX_1) + return D3DXERR_INVALIDDATA; + if (!(size = D3DXGetShaderSize(function))) return D3DXERR_INVALIDDATA; diff --git a/dlls/d3dx9_36/tests/texture.c b/dlls/d3dx9_36/tests/texture.c index 30495508ac3..b0dd3c0c6c3 100644 --- a/dlls/d3dx9_36/tests/texture.c +++ b/dlls/d3dx9_36/tests/texture.c @@ -2475,17 +2475,25 @@ float4 main(float3 pos : POSITION, float3 size : PSIZE) : COLOR hr = D3DXCreateTextureShader(NULL, NULL); ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#lx.\n", hr); + tx = (void *)0xdeadbeef; hr = D3DXCreateTextureShader(NULL, &tx); ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#lx.\n", hr); + ok(tx == (void *)0xdeadbeef, "Unexpected pointer %p.\n", tx); + tx = (void *)0xdeadbeef; hr = D3DXCreateTextureShader(shader_invalid, &tx); - todo_wine ok(hr == D3DXERR_INVALIDDATA, "Got unexpected hr %#lx.\n", hr); + ok(hr == D3DXERR_INVALIDDATA, "Got unexpected hr %#lx.\n", hr); + ok(tx == (void *)0xdeadbeef, "Unexpected pointer %p.\n", tx); + tx = (void *)0xdeadbeef; hr = D3DXCreateTextureShader(shader_zero, &tx); - todo_wine ok(hr == D3DXERR_INVALIDDATA, "Got unexpected hr %#lx.\n", hr); + ok(hr == D3DXERR_INVALIDDATA, "Got unexpected hr %#lx.\n", hr); + ok(tx == (void *)0xdeadbeef, "Unexpected pointer %p.\n", tx); + tx = (void *)0xdeadbeef; hr = D3DXCreateTextureShader(shader_empty, &tx); - todo_wine ok(hr == D3DXERR_INVALIDDATA, "Got unexpected hr %#lx.\n", hr); + ok(hr == D3DXERR_INVALIDDATA, "Got unexpected hr %#lx.\n", hr); + ok(tx == (void *)0xdeadbeef, "Unexpected pointer %p.\n", tx); hr = D3DXCreateTextureShader(shader_code, &tx); ok(SUCCEEDED(hr), "Got unexpected hr %#lx.\n", hr); -- 2.11.4.GIT