Rico Schüller : d3d10: Add argument check to ID3D10Effect::GetTechniqueByName().

Alexandre Julliard julliard at winehq.org
Mon May 17 09:39:27 CDT 2010


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

Author: Rico Schüller <kgbricola at web.de>
Date:   Sat May 15 22:04:02 2010 +0200

d3d10: Add argument check to ID3D10Effect::GetTechniqueByName().

---

 dlls/d3d10/effect.c       |    8 ++++++++
 dlls/d3d10/tests/effect.c |   39 ++++++++++++++++++++++++++++++++++++---
 2 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c
index 9a6c843..43b94f3 100644
--- a/dlls/d3d10/effect.c
+++ b/dlls/d3d10/effect.c
@@ -2299,6 +2299,12 @@ static struct ID3D10EffectTechnique * STDMETHODCALLTYPE d3d10_effect_GetTechniqu
 
     TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
 
+    if (!name)
+    {
+        WARN("Invalid name specified\n");
+        return (ID3D10EffectTechnique *)&null_technique;
+    }
+
     for (i = 0; i < This->technique_count; ++i)
     {
         struct d3d10_effect_technique *t = &This->techniques[i];
@@ -2458,6 +2464,8 @@ static struct ID3D10EffectPass * STDMETHODCALLTYPE d3d10_effect_technique_GetPas
 
     TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
 
+    /* Do not check for name==NULL, W7/DX10 crashes in that case. */
+
     for (i = 0; i < This->pass_count; ++i)
     {
         struct d3d10_effect_pass *p = &This->passes[i];
diff --git a/dlls/d3d10/tests/effect.c b/dlls/d3d10/tests/effect.c
index f37f945..a8c5886 100644
--- a/dlls/d3d10/tests/effect.c
+++ b/dlls/d3d10/tests/effect.c
@@ -2648,8 +2648,8 @@ static void test_effect_local_shader(ID3D10Device *device)
     BOOL ret;
     ID3D10Effect* effect;
     ID3D10EffectVariable* v;
-    ID3D10EffectPass *p, *null_pass;
-    ID3D10EffectTechnique *t;
+    ID3D10EffectPass *p, *p2, *null_pass;
+    ID3D10EffectTechnique *t, *t2, *null_technique;
     D3D10_PASS_SHADER_DESC pdesc = {0};
     D3D10_EFFECT_VARIABLE_DESC vdesc = {0};
     ID3D10EffectType *type;
@@ -2660,8 +2660,37 @@ static void test_effect_local_shader(ID3D10Device *device)
     hr = create_effect(fx_local_shader, 0, device, NULL, &effect);
     ok(SUCCEEDED(hr), "D3D10CreateEffectFromMemory failed!\n");
 
+    null_technique = effect->lpVtbl->GetTechniqueByIndex(effect, 0xffffffff);
+    null_pass = null_technique->lpVtbl->GetPassByIndex(null_technique, 0xffffffff);
+
+    /* check technique */
+    t = effect->lpVtbl->GetTechniqueByName(effect, NULL);
+    ok(null_technique == t, "GetTechniqueByName got %p, expected %p\n", t, null_technique);
+
+    t = effect->lpVtbl->GetTechniqueByName(effect, "invalid");
+    ok(null_technique == t, "GetTechniqueByName got %p, expected %p\n", t, null_technique);
+
     t = effect->lpVtbl->GetTechniqueByIndex(effect, 0);
-    null_pass = t->lpVtbl->GetPassByIndex(t, 10000);
+    ok(null_technique != t, "GetTechniqueByIndex failed %p\n", t);
+
+    t2 = effect->lpVtbl->GetTechniqueByName(effect, "Render");
+    ok(t2 == t, "GetTechniqueByName got %p, expected %p\n", t2, t);
+
+    /* check invalid pass arguments */
+    p = null_technique->lpVtbl->GetPassByName(null_technique, NULL);
+    ok(null_pass == p, "GetPassByName got %p, expected %p\n", p, null_pass);
+
+    p = null_technique->lpVtbl->GetPassByName(null_technique, "invalid");
+    ok(null_pass == p, "GetPassByName got %p, expected %p\n", p, null_pass);
+
+#if 0
+    /* This crashes on W7/DX10, if t is a valid technique and name=NULL. */
+    p = t->lpVtbl->GetPassByName(t, NULL);
+    ok(null_pass == p, "GetPassByName got %p, expected %p\n", p, null_pass);
+#endif
+
+    p = t->lpVtbl->GetPassByIndex(t, 0xffffffff);
+    ok(null_pass == p, "GetPassByIndex got %p, expected %p\n", p, null_pass);
 
     /* check for invalid arguments */
     hr = null_pass->lpVtbl->GetVertexShaderDesc(null_pass, NULL);
@@ -2682,9 +2711,13 @@ static void test_effect_local_shader(ID3D10Device *device)
     hr = null_pass->lpVtbl->GetGeometryShaderDesc(null_pass, &pdesc);
     ok(hr == E_FAIL, "GetGeometryShaderDesc got %x, expected %x\n", hr, E_FAIL);
 
+    /* check valid pass arguments */
     t = effect->lpVtbl->GetTechniqueByIndex(effect, 0);
     p = t->lpVtbl->GetPassByIndex(t, 0);
 
+    p2 = t->lpVtbl->GetPassByName(t, "P0");
+    ok(p2 == p, "GetPassByName got %p, expected %p\n", p2, p);
+
     hr = p->lpVtbl->GetVertexShaderDesc(p, NULL);
     ok(hr == E_INVALIDARG, "GetVertexShaderDesc got %x, expected %x\n", hr, E_INVALIDARG);
 




More information about the wine-cvs mailing list