summaryrefslogtreecommitdiff
path: root/libs/hwui/renderthread/VulkanManager.cpp
diff options
context:
space:
mode:
authorRoman Kiryanov <rkir@google.com>2019-03-07 18:22:19 -0800
committerRoman Kiryanov <rkir@google.com>2019-03-11 16:07:20 -0700
commit74ace839e01801ee01cf841bf27762947a70d8b1 (patch)
treebafd99335b7196f9892b2c4b1f368f56d94e2065 /libs/hwui/renderthread/VulkanManager.cpp
parent6c1d1c32e3aefc0414eda1fdf1af7edf9ef6100a (diff)
Copy extension names to an owning container to prevent use-after-free
Bug: 127660235 Test: make -j Change-Id: I3748b7b4b51f99acf59748675223cef02c22bee2 Signed-off-by: Roman Kiryanov <rkir@google.com>
Diffstat (limited to 'libs/hwui/renderthread/VulkanManager.cpp')
-rw-r--r--libs/hwui/renderthread/VulkanManager.cpp28
1 files changed, 15 insertions, 13 deletions
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index 5af660c8738a..ce2dddc69049 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -79,7 +79,9 @@ void VulkanManager::destroy() {
mDevice = VK_NULL_HANDLE;
mPhysicalDevice = VK_NULL_HANDLE;
mInstance = VK_NULL_HANDLE;
+ mInstanceExtensionsOwner.clear();
mInstanceExtensions.clear();
+ mDeviceExtensionsOwner.clear();
mDeviceExtensions.clear();
free_features_extensions_structs(mPhysicalDeviceFeatures2);
mPhysicalDeviceFeatures2 = {};
@@ -104,18 +106,18 @@ void VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
uint32_t extensionCount = 0;
err = mEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);
LOG_ALWAYS_FATAL_IF(VK_SUCCESS != err);
- std::unique_ptr<VkExtensionProperties[]> extensions(
- new VkExtensionProperties[extensionCount]);
- err = mEnumerateInstanceExtensionProperties(nullptr, &extensionCount, extensions.get());
+ mInstanceExtensionsOwner.resize(extensionCount);
+ err = mEnumerateInstanceExtensionProperties(nullptr, &extensionCount,
+ mInstanceExtensionsOwner.data());
LOG_ALWAYS_FATAL_IF(VK_SUCCESS != err);
bool hasKHRSurfaceExtension = false;
bool hasKHRAndroidSurfaceExtension = false;
- for (uint32_t i = 0; i < extensionCount; ++i) {
- mInstanceExtensions.push_back(extensions[i].extensionName);
- if (!strcmp(extensions[i].extensionName, VK_KHR_SURFACE_EXTENSION_NAME)) {
+ for (const VkExtensionProperties& extension : mInstanceExtensionsOwner) {
+ mInstanceExtensions.push_back(extension.extensionName);
+ if (!strcmp(extension.extensionName, VK_KHR_SURFACE_EXTENSION_NAME)) {
hasKHRSurfaceExtension = true;
}
- if (!strcmp(extensions[i].extensionName,VK_KHR_ANDROID_SURFACE_EXTENSION_NAME)) {
+ if (!strcmp(extension.extensionName, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME)) {
hasKHRAndroidSurfaceExtension = true;
}
}
@@ -193,15 +195,14 @@ void VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
err = mEnumerateDeviceExtensionProperties(mPhysicalDevice, nullptr, &extensionCount,
nullptr);
LOG_ALWAYS_FATAL_IF(VK_SUCCESS != err);
- std::unique_ptr<VkExtensionProperties[]> extensions(
- new VkExtensionProperties[extensionCount]);
+ mDeviceExtensionsOwner.resize(extensionCount);
err = mEnumerateDeviceExtensionProperties(mPhysicalDevice, nullptr, &extensionCount,
- extensions.get());
+ mDeviceExtensionsOwner.data());
LOG_ALWAYS_FATAL_IF(VK_SUCCESS != err);
bool hasKHRSwapchainExtension = false;
- for (uint32_t i = 0; i < extensionCount; ++i) {
- mDeviceExtensions.push_back(extensions[i].extensionName);
- if (!strcmp(extensions[i].extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME)) {
+ for (const VkExtensionProperties& extension : mDeviceExtensionsOwner) {
+ mDeviceExtensions.push_back(extension.extensionName);
+ if (!strcmp(extension.extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME)) {
hasKHRSwapchainExtension = true;
}
}
@@ -214,6 +215,7 @@ void VulkanManager::setupDevice(GrVkExtensions& grExtensions, VkPhysicalDeviceFe
}
return vkGetInstanceProcAddr(instance, proc_name);
};
+
grExtensions.init(getProc, mInstance, mPhysicalDevice, mInstanceExtensions.size(),
mInstanceExtensions.data(), mDeviceExtensions.size(), mDeviceExtensions.data());