Christian Costa : d3drm: Check params in IDirect3DRMMeshBuilder2Impl_GetVertices + tests.

Alexandre Julliard julliard at winehq.org
Mon Dec 17 13:58:23 CST 2012


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

Author: Christian Costa <titan.costa at gmail.com>
Date:   Mon Dec 17 10:11:44 2012 +0100

d3drm: Check params in IDirect3DRMMeshBuilder2Impl_GetVertices + tests.

---

 dlls/d3drm/meshbuilder.c |    8 ++++++++
 dlls/d3drm/tests/d3drm.c |   18 ++++++++++++++++++
 2 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/dlls/d3drm/meshbuilder.c b/dlls/d3drm/meshbuilder.c
index ffbdec7..bf9a162 100644
--- a/dlls/d3drm/meshbuilder.c
+++ b/dlls/d3drm/meshbuilder.c
@@ -801,14 +801,22 @@ static HRESULT WINAPI IDirect3DRMMeshBuilder2Impl_GetVertices(IDirect3DRMMeshBui
 
     TRACE("(%p)->(%p,%p,%p,%p,%p,%p)\n", This, vcount, vertices, ncount, normals, face_data_size, face_data);
 
+    if (vertices && (!vcount || (*vcount < This->nb_vertices)))
+        return D3DRMERR_BADVALUE;
     if (vcount)
         *vcount = This->nb_vertices;
     if (vertices && This->nb_vertices)
         memcpy(vertices, This->pVertices, This->nb_vertices * sizeof(D3DVECTOR));
+
+    if (normals && (!ncount || (*ncount < This->nb_normals)))
+        return D3DRMERR_BADVALUE;
     if (ncount)
         *ncount = This->nb_normals;
     if (normals && This->nb_normals)
         memcpy(normals, This->pNormals, This->nb_normals * sizeof(D3DVECTOR));
+
+    if (face_data && (!face_data_size || (*face_data_size < This->face_data_size)))
+        return D3DRMERR_BADVALUE;
     if (face_data_size)
         *face_data_size = This->face_data_size;
     if (face_data && This->face_data_size)
diff --git a/dlls/d3drm/tests/d3drm.c b/dlls/d3drm/tests/d3drm.c
index 97e047a..6eb7bd0 100644
--- a/dlls/d3drm/tests/d3drm.c
+++ b/dlls/d3drm/tests/d3drm.c
@@ -393,6 +393,24 @@ static void test_MeshBuilder(void)
     val = IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder);
     ok(val == 1, "Wrong number of faces %d (must be 1)\n", val);
 
+    /* Check no buffer size and too small buffer size errors */
+    val1 = 1; val2 = 3; val3 = 8;
+    hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, &val1, v, &val2, n, &val3, f);
+    ok(hr == D3DRMERR_BADVALUE, "IDirect3DRMMeshBuilder_GetVertices returned %#x\n", hr);
+    hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, NULL, v, &val2, n, &val3, f);
+    ok(hr == D3DRMERR_BADVALUE, "IDirect3DRMMeshBuilder_GetVertices returned %#x\n", hr);
+    val1 = 3; val2 = 1; val3 = 8;
+    hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, &val1, v, &val2, n, &val3, f);
+    ok(hr == D3DRMERR_BADVALUE, "IDirect3DRMMeshBuilder_GetVertices returned %#x\n", hr);
+    hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, &val1, v, NULL, n, &val3, f);
+    ok(hr == D3DRMERR_BADVALUE, "IDirect3DRMMeshBuilder_GetVertices returned %#x\n", hr);
+    val1 = 3; val2 = 3; val3 = 1;
+    hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, &val1, v, &val2, n, &val3, f);
+    ok(hr == D3DRMERR_BADVALUE, "IDirect3DRMMeshBuilder_GetVertices returned %#x\n", hr);
+    hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, &val1, v, &val2, n, NULL, f);
+    ok(hr == D3DRMERR_BADVALUE, "IDirect3DRMMeshBuilder_GetVertices returned %#x\n", hr);
+
+    val1 = 3; val2 = 3; val3 = 8;
     hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, &val1, v, &val2, n, &val3, f);
     ok(hr == D3DRM_OK, "Cannot get vertices information (hr = %x)\n", hr);
     ok(val1 == 3, "Wrong number of vertices %d (must be 3)\n", val1);




More information about the wine-cvs mailing list