diff options
| author | 2019-10-25 13:34:21 -0700 | |
|---|---|---|
| committer | 2019-10-28 12:55:59 -0700 | |
| commit | 60307ce84d311beef63e1fe770ba49e3fde7133a (patch) | |
| tree | 4df22a6b113e3f590e57ef35efb87bad2f21c646 | |
| parent | 30266c647021491da73ba49a9d28f29ac8da4133 (diff) | |
[frameworks][native][vulkan] fix -Walloca
Alloca cannot be checked for failure. Replace alloca with dynamic memory
allocations.
Reapply a commit that was previously reverted. The original commit
removed a call to enumerate_instance_layers() that it should not have.
Prefer std::vector to std::unique_ptr of an array.
Bug: 139945549
Bug: 142475221
Bug: 143156243
Test: mm && adb shell stop && adb sync && adb shell start && atest -it \
CtsGpuToolsHostTestCases:android.gputools.cts.CtsRootlessGpuDebugHostTest#testDebugLayerLoadExternalVulkan,testMultipleExternalApps,testSystemPropertyIgnoreVulkan,testDebugLayerLoadVulkan,testSystemPropertyEnableVulkan
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
Change-Id: Ifdf747fdabc41ee6da8cd83bda5e3f030649030f
| -rw-r--r-- | vulkan/libvulkan/driver.cpp | 16 | ||||
| -rw-r--r-- | vulkan/libvulkan/layers_extensions.cpp | 40 |
2 files changed, 20 insertions, 36 deletions
diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp index a544bc5ff8..d92f35ac23 100644 --- a/vulkan/libvulkan/driver.cpp +++ b/vulkan/libvulkan/driver.cpp @@ -151,15 +151,12 @@ class CreateInfoWrapper { Hal Hal::hal_; void* LoadLibrary(const android_dlextinfo& dlextinfo, - const char* subname, - int subname_len) { + const std::string_view subname) { ATRACE_CALL(); - const char kLibFormat[] = "vulkan.%*s.so"; - char* name = static_cast<char*>( - alloca(sizeof(kLibFormat) + static_cast<size_t>(subname_len))); - sprintf(name, kLibFormat, subname_len, subname); - return android_dlopen_ext(name, RTLD_LOCAL | RTLD_NOW, &dlextinfo); + std::stringstream ss; + ss << "vulkan." << subname << ".so"; + return android_dlopen_ext(ss.str().c_str(), RTLD_LOCAL | RTLD_NOW, &dlextinfo); } const std::array<const char*, 2> HAL_SUBNAME_KEY_PROPERTIES = {{ @@ -179,8 +176,9 @@ int LoadDriver(android_namespace_t* library_namespace, char prop[PROPERTY_VALUE_MAX]; for (auto key : HAL_SUBNAME_KEY_PROPERTIES) { int prop_len = property_get(key, prop, nullptr); - if (prop_len > 0) { - so = LoadLibrary(dlextinfo, prop, prop_len); + if (prop_len > 0 && prop_len <= UINT_MAX) { + std::string_view lib_name(prop, static_cast<unsigned int>(prop_len)); + so = LoadLibrary(dlextinfo, lib_name); if (so) break; } diff --git a/vulkan/libvulkan/layers_extensions.cpp b/vulkan/libvulkan/layers_extensions.cpp index 2f33fee8ac..22f92d619d 100644 --- a/vulkan/libvulkan/layers_extensions.cpp +++ b/vulkan/libvulkan/layers_extensions.cpp @@ -95,9 +95,7 @@ class LayerLibrary { bool EnumerateLayers(size_t library_idx, std::vector<Layer>& instance_layers) const; - void* GetGPA(const Layer& layer, - const char* gpa_name, - size_t gpa_name_len) const; + void* GetGPA(const Layer& layer, const std::string_view gpa_name) const; const std::string GetFilename() { return filename_; } @@ -220,9 +218,8 @@ bool LayerLibrary::EnumerateLayers(size_t library_idx, } // get layer properties - VkLayerProperties* properties = static_cast<VkLayerProperties*>(alloca( - (num_instance_layers + num_device_layers) * sizeof(VkLayerProperties))); - result = enumerate_instance_layers(&num_instance_layers, properties); + std::vector<VkLayerProperties> properties(num_instance_layers + num_device_layers); + result = enumerate_instance_layers(&num_instance_layers, properties.data()); if (result != VK_SUCCESS) { ALOGE("vkEnumerateInstanceLayerProperties failed for library '%s': %d", path_.c_str(), result); @@ -230,7 +227,7 @@ bool LayerLibrary::EnumerateLayers(size_t library_idx, } if (num_device_layers > 0) { result = enumerate_device_layers(VK_NULL_HANDLE, &num_device_layers, - properties + num_instance_layers); + &properties[num_instance_layers]); if (result != VK_SUCCESS) { ALOGE( "vkEnumerateDeviceLayerProperties failed for library '%s': %d", @@ -315,21 +312,11 @@ bool LayerLibrary::EnumerateLayers(size_t library_idx, return true; } -void* LayerLibrary::GetGPA(const Layer& layer, - const char* gpa_name, - size_t gpa_name_len) const { - void* gpa; - size_t layer_name_len = - std::max(size_t{2}, strlen(layer.properties.layerName)); - char* name = static_cast<char*>(alloca(layer_name_len + gpa_name_len + 1)); - strcpy(name, layer.properties.layerName); - strcpy(name + layer_name_len, gpa_name); - if (!(gpa = GetTrampoline(name))) { - strcpy(name, "vk"); - strcpy(name + 2, gpa_name); - gpa = GetTrampoline(name); - } - return gpa; +void* LayerLibrary::GetGPA(const Layer& layer, const std::string_view gpa_name) const { + std::string layer_name { layer.properties.layerName }; + if (void* gpa = GetTrampoline((layer_name.append(gpa_name).c_str()))) + return gpa; + return GetTrampoline((std::string {"vk"}.append(gpa_name)).c_str()); } // ---------------------------------------------------------------------------- @@ -464,10 +451,9 @@ const VkExtensionProperties* FindExtension( } void* GetLayerGetProcAddr(const Layer& layer, - const char* gpa_name, - size_t gpa_name_len) { + const std::string_view gpa_name) { const LayerLibrary& library = g_layer_libraries[layer.library_idx]; - return library.GetGPA(layer, gpa_name, gpa_name_len); + return library.GetGPA(layer, gpa_name); } } // anonymous namespace @@ -550,13 +536,13 @@ LayerRef::LayerRef(LayerRef&& other) noexcept : layer_(other.layer_) { PFN_vkGetInstanceProcAddr LayerRef::GetGetInstanceProcAddr() const { return layer_ ? reinterpret_cast<PFN_vkGetInstanceProcAddr>( - GetLayerGetProcAddr(*layer_, "GetInstanceProcAddr", 19)) + GetLayerGetProcAddr(*layer_, "GetInstanceProcAddr")) : nullptr; } PFN_vkGetDeviceProcAddr LayerRef::GetGetDeviceProcAddr() const { return layer_ ? reinterpret_cast<PFN_vkGetDeviceProcAddr>( - GetLayerGetProcAddr(*layer_, "GetDeviceProcAddr", 17)) + GetLayerGetProcAddr(*layer_, "GetDeviceProcAddr")) : nullptr; } |