[PATCH 1/2] d3drm: Check params in IDirect3DRMMeshBuilder2Impl_GetVertices + tests.
Christian Costa
titan.costa at gmail.com
Mon Dec 17 03:11:44 CST 2012
---
dlls/d3drm/meshbuilder.c | 8 ++++++++
dlls/d3drm/tests/d3drm.c | 18 ++++++++++++++++++
2 files changed, 26 insertions(+)
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-patches
mailing list