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