=?UTF-8?Q?Rico=20Sch=C3=BCller=20?=: d3dx9: Reorder argument check in D3DXGetShaderConstantTableEx().

Alexandre Julliard julliard at winehq.org
Mon Jan 23 13:00:56 CST 2012


Module: wine
Branch: master
Commit: 6ad34b161f57a95d124de5a306088b337be5edc6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6ad34b161f57a95d124de5a306088b337be5edc6

Author: Rico Schüller <kgbricola at web.de>
Date:   Sun Jan 22 11:29:08 2012 +0100

d3dx9: Reorder argument check in D3DXGetShaderConstantTableEx().

---

 dlls/d3dx9_36/shader.c |   35 +++++++++++++++++++++--------------
 1 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index 775899d..eff3935 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -1175,11 +1175,30 @@ HRESULT WINAPI D3DXGetShaderConstantTableEx(CONST DWORD *byte_code,
     TRACE("(%p, %x, %p)\n", byte_code, flags, constant_table);
 
     if (!byte_code || !constant_table)
+    {
+        WARN("Invalid argument specified.\n");
         return D3DERR_INVALIDCALL;
+    }
 
     hr = D3DXFindShaderComment(byte_code, MAKEFOURCC('C','T','A','B'), &data, &size);
     if (hr != D3D_OK)
+    {
+        WARN("CTAB not found.\n");
+        return D3DXERR_INVALIDDATA;
+    }
+
+    if (size < sizeof(D3DXSHADER_CONSTANTTABLE))
+    {
+        WARN("Invalid CTAB size.\n");
+        return D3DXERR_INVALIDDATA;
+    }
+
+    ctab_header = (const D3DXSHADER_CONSTANTTABLE *)data;
+    if (ctab_header->Size != sizeof(D3DXSHADER_CONSTANTTABLE))
+    {
+        WARN("Invalid D3DXSHADER_CONSTANTTABLE size.\n");
         return D3DXERR_INVALIDDATA;
+    }
 
     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
     if (!object)
@@ -1191,28 +1210,16 @@ HRESULT WINAPI D3DXGetShaderConstantTableEx(CONST DWORD *byte_code,
     object->ID3DXConstantTable_iface.lpVtbl = &ID3DXConstantTable_Vtbl;
     object->ref = 1;
 
-    if (size < sizeof(D3DXSHADER_CONSTANTTABLE))
-    {
-        hr = D3DXERR_INVALIDDATA;
-        goto error;
-    }
-
     object->ctab = HeapAlloc(GetProcessHeap(), 0, size);
     if (!object->ctab)
     {
         ERR("Out of memory\n");
-        hr = E_OUTOFMEMORY;
-        goto error;
+        HeapFree(GetProcessHeap(), 0, object);
+        return E_OUTOFMEMORY;
     }
     object->size = size;
     memcpy(object->ctab, data, object->size);
 
-    ctab_header = (const D3DXSHADER_CONSTANTTABLE*)data;
-    if (ctab_header->Size != sizeof(D3DXSHADER_CONSTANTTABLE))
-    {
-        hr = D3DXERR_INVALIDDATA;
-        goto error;
-    }
     object->desc.Creator = ctab_header->Creator ? object->ctab + ctab_header->Creator : NULL;
     object->desc.Version = ctab_header->Version;
     object->desc.Constants = ctab_header->Constants;




More information about the wine-cvs mailing list