Fix memory corruption vktApiObjectManagementTests
authorBoris Zanin <boris.zanin@mobica.com>
Thu, 7 Sep 2017 11:08:20 +0000 (13:08 +0200)
committerAlexander Galazin <Alexander.Galazin@arm.com>
Fri, 15 Sep 2017 19:43:52 +0000 (15:43 -0400)
Due to s_deviceCases is declared as non-static arrays the pointers
to these structures cannot be included into static arrays such as
s_createSingleGroup, s_createMultipleUniqueResourcesGroup, etc.

During second call references in arrays like s_createSingleGroup,
s_createMultipleUniqueResourcesGroup, etc will point to invalid
memory and most likely will lead to crash.

Fix: make dependend structures also non-static.

Update tests:
 * dEQP-VK.api.object_management.*

Components: Vulkan

VK-GL-CTS issue: 674

Change-Id: I23ace5fe0bcdd1db9400fc8437218941a045cf25

external/vulkancts/modules/vulkan/api/vktApiObjectManagementTests.cpp

index 04945a7..bc73fe7 100644 (file)
@@ -2741,12 +2741,12 @@ tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
 
        const DescriptorSetLayout::Parameters   singleUboDescLayout     = DescriptorSetLayout::Parameters::single(0u, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1u, VK_SHADER_STAGE_VERTEX_BIT);
 
-       static NamedParameters<Instance>                                s_instanceCases[]                       =
+       static const NamedParameters<Instance>                                  s_instanceCases[]                               =
        {
                { "instance",                                   Instance::Parameters() },
        };
        // \note Device index may change - must not be static
-       const NamedParameters<Device>                                   s_deviceCases[]                         =
+       const NamedParameters<Device>                           s_deviceCases[]                                 =
        {
                { "device",                                             Device::Parameters(testCtx.getCommandLine().getVKDeviceId()-1u, VK_QUEUE_GRAPHICS_BIT)  },
        };
@@ -2857,7 +2857,7 @@ tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
                { "command_buffer_secondary",   CommandBuffer::Parameters(CommandPool::Parameters((VkCommandPoolCreateFlags)0u), VK_COMMAND_BUFFER_LEVEL_SECONDARY)     }
        };
 
-       static const CaseDescriptions   s_createSingleGroup     =
+       const CaseDescriptions  s_createSingleGroup     =
        {
                CASE_DESC(createSingleTest      <Instance>,                                     s_instanceCases),
                CASE_DESC(createSingleTest      <Device>,                                       s_deviceCases),
@@ -2886,7 +2886,7 @@ tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
        };
        objectMgmtTests->addChild(createGroup(testCtx, "single", "Create single object", s_createSingleGroup));
 
-       static const CaseDescriptions   s_createMultipleUniqueResourcesGroup    =
+       const CaseDescriptions  s_createMultipleUniqueResourcesGroup    =
        {
                CASE_DESC(createMultipleUniqueResourcesTest     <Instance>,                                     s_instanceCases),
                CASE_DESC(createMultipleUniqueResourcesTest     <Device>,                                       s_deviceCases),
@@ -2915,7 +2915,7 @@ tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
        };
        objectMgmtTests->addChild(createGroup(testCtx, "multiple_unique_resources", "Multiple objects with per-object unique resources", s_createMultipleUniqueResourcesGroup));
 
-       static const CaseDescriptions   s_createMultipleSharedResourcesGroup    =
+       const CaseDescriptions  s_createMultipleSharedResourcesGroup    =
        {
                EMPTY_CASE_DESC(Instance), // No resources used
                CASE_DESC(createMultipleSharedResourcesTest     <Device>,                                       s_deviceCases),
@@ -2944,7 +2944,7 @@ tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
        };
        objectMgmtTests->addChild(createGroup(testCtx, "multiple_shared_resources", "Multiple objects with shared resources", s_createMultipleSharedResourcesGroup));
 
-       static const CaseDescriptions   s_createMaxConcurrentGroup      =
+       const CaseDescriptions  s_createMaxConcurrentGroup      =
        {
                CASE_DESC(createMaxConcurrentTest       <Instance>,                                     s_instanceCases),
                CASE_DESC(createMaxConcurrentTest       <Device>,                                       s_deviceCases),
@@ -2973,7 +2973,7 @@ tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
        };
        objectMgmtTests->addChild(createGroup(testCtx, "max_concurrent", "Maximum number of concurrently live objects", s_createMaxConcurrentGroup));
 
-       static const CaseDescriptions   s_multithreadedCreatePerThreadDeviceGroup       =
+       const CaseDescriptions  s_multithreadedCreatePerThreadDeviceGroup       =
        {
                EMPTY_CASE_DESC(Instance),      // Does not make sense
                EMPTY_CASE_DESC(Device),        // Does not make sense
@@ -3002,7 +3002,7 @@ tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
        };
        objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_per_thread_device", "Multithreaded object construction with per-thread device ", s_multithreadedCreatePerThreadDeviceGroup));
 
-       static const CaseDescriptions   s_multithreadedCreatePerThreadResourcesGroup    =
+       const CaseDescriptions  s_multithreadedCreatePerThreadResourcesGroup    =
        {
                CASE_DESC(multithreadedCreatePerThreadResourcesTest     <Instance>,                                     s_instanceCases),
                CASE_DESC(multithreadedCreatePerThreadResourcesTest     <Device>,                                       s_deviceCases),
@@ -3031,7 +3031,7 @@ tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
        };
        objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_per_thread_resources", "Multithreaded object construction with per-thread resources", s_multithreadedCreatePerThreadResourcesGroup));
 
-       static const CaseDescriptions   s_multithreadedCreateSharedResourcesGroup       =
+       const CaseDescriptions  s_multithreadedCreateSharedResourcesGroup       =
        {
                EMPTY_CASE_DESC(Instance),
                CASE_DESC(multithreadedCreateSharedResourcesTest        <Device>,                                       s_deviceCases),
@@ -3060,7 +3060,7 @@ tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
        };
        objectMgmtTests->addChild(createGroup(testCtx, "multithreaded_shared_resources", "Multithreaded object construction with shared resources", s_multithreadedCreateSharedResourcesGroup));
 
-       static const CaseDescriptions   s_createSingleAllocCallbacksGroup       =
+       const CaseDescriptions  s_createSingleAllocCallbacksGroup       =
        {
                CASE_DESC(createSingleAllocCallbacksTest        <Instance>,                                     s_instanceCases),
                CASE_DESC(createSingleAllocCallbacksTest        <Device>,                                       s_deviceCases),
@@ -3090,7 +3090,7 @@ tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
        objectMgmtTests->addChild(createGroup(testCtx, "single_alloc_callbacks", "Create single object", s_createSingleAllocCallbacksGroup));
 
        // \note Skip pooled objects in this test group. They are properly handled by the "multiple" group farther down below.
-       static const CaseDescriptions   s_allocCallbackFailGroup        =
+       const CaseDescriptions  s_allocCallbackFailGroup        =
        {
                CASE_DESC(allocCallbackFailTest <Instance>,                                     s_instanceCases),
                CASE_DESC(allocCallbackFailTest <Device>,                                       s_deviceCases),
@@ -3120,7 +3120,7 @@ tcu::TestCaseGroup* createObjectManagementTests (tcu::TestContext& testCtx)
        objectMgmtTests->addChild(createGroup(testCtx, "alloc_callback_fail", "Allocation callback failure", s_allocCallbackFailGroup));
 
        // \note Test objects that can be created in bulk
-       static const CaseDescriptions   s_allocCallbackFailMultipleObjectsGroup =
+       const CaseDescriptions  s_allocCallbackFailMultipleObjectsGroup =
        {
                EMPTY_CASE_DESC(Instance),                      // most objects can be created one at a time only
                EMPTY_CASE_DESC(Device),