Module: wine Branch: master Commit: 871aa9d14daafb869a546a738498716ad58d54dd URL: http://source.winehq.org/git/wine.git/?a=commit;h=871aa9d14daafb869a546a7384...
Author: Christian Costa titan.costa@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);