=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: d3dx9: Validate the size of a volume texture in D3DXGetImageInfoFromFile.

Alexandre Julliard julliard at winehq.org
Mon Jul 9 14:56:39 CDT 2012


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

Author: Józef Kucia <joseph.kucia at gmail.com>
Date:   Tue Jul  3 16:06:43 2012 +0200

d3dx9: Validate the size of a volume texture in D3DXGetImageInfoFromFile.

---

 dlls/d3dx9_36/surface.c       |    9 ++++++---
 dlls/d3dx9_36/tests/surface.c |    2 +-
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c
index 845a1f7..6d2e778 100644
--- a/dlls/d3dx9_36/surface.c
+++ b/dlls/d3dx9_36/surface.c
@@ -317,8 +317,8 @@ static HRESULT calculate_dds_surface_size(const D3DXIMAGE_INFO *img_info,
 static HRESULT get_image_info_from_dds(const void *buffer, UINT length, D3DXIMAGE_INFO *info)
 {
    UINT i;
-   UINT faces = 0;
-   UINT width, height;
+   UINT faces = 1;
+   UINT width, height, depth;
    const struct dds_header *header = buffer;
    UINT expected_length = 0;
 
@@ -347,6 +347,7 @@ static HRESULT get_image_info_from_dds(const void *buffer, UINT length, D3DXIMAG
    else if (header->caps2 & DDS_CAPS2_CUBEMAP)
    {
        DWORD face;
+       faces = 0;
        for (face = DDS_CAPS2_CUBEMAP_POSITIVEX; face <= DDS_CAPS2_CUBEMAP_NEGATIVEZ; face <<= 1)
        {
            if (header->caps2 & face)
@@ -356,20 +357,22 @@ static HRESULT get_image_info_from_dds(const void *buffer, UINT length, D3DXIMAG
    }
    else
    {
-       faces = 1;
        info->ResourceType = D3DRTYPE_TEXTURE;
    }
 
    /* calculate the expected length */
    width = info->Width;
    height = info->Height;
+   depth = info->Depth;
    for (i = 0; i < info->MipLevels; i++)
    {
        UINT pitch, size = 0;
        calculate_dds_surface_size(info, width, height, &pitch, &size);
+       size *= depth;
        expected_length += size;
        width = max(1, width / 2);
        height = max(1, height / 2);
+       depth = max(1, depth / 2);
    }
 
    expected_length *= faces;
diff --git a/dlls/d3dx9_36/tests/surface.c b/dlls/d3dx9_36/tests/surface.c
index 84b1c56..5a01200 100644
--- a/dlls/d3dx9_36/tests/surface.c
+++ b/dlls/d3dx9_36/tests/surface.c
@@ -544,7 +544,7 @@ static void test_D3DXGetImageInfo(void)
     ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA);
 
     hr = D3DXGetImageInfoFromFileInMemory(dds_volume_map, sizeof(dds_volume_map) - 1, &info);
-    todo_wine ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA);
+    ok(hr == D3DXERR_INVALIDDATA, "D3DXGetImageInfoFromFileInMemory returned %#x, expected %#x\n", hr, D3DXERR_INVALIDDATA);
 
 
     /* cleanup */




More information about the wine-cvs mailing list