From a8baab0c852aa88691d3347b53ba573f761084a0 Mon Sep 17 00:00:00 2001 From: Jason Macnak Date: Fri, 19 Feb 2021 12:53:47 -0800 Subject: Update checking debug.vulkan.layer.* system props ... to scan a fixed range of priorities followed by consecutive priorities instead of scanning all system props (property_list()) which causes sepolicy audits when Vulkan is loaded in a process with a restrictive sepolicy. This avoids sepolicy audits in system_server for example when running on Cuttlefish with SwANGLE (ANGLE GL on top of SwiftShader Vulkan). Bug: b/179967574 Test: boot Cuttlefish with SwANGLE and inspect audit logs Change-Id: I63b3f45113fbdd3ab62c22f062150e25b99d7352 --- vulkan/libvulkan/api.cpp | 54 ++++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 22 deletions(-) (limited to 'vulkan/libvulkan/api.cpp') diff --git a/vulkan/libvulkan/api.cpp b/vulkan/libvulkan/api.cpp index 5b9affd03a..9aaac5f1d6 100644 --- a/vulkan/libvulkan/api.cpp +++ b/vulkan/libvulkan/api.cpp @@ -33,6 +33,7 @@ #include #include +#include #include #include #include @@ -134,7 +135,7 @@ class OverrideLayerNames { // If no layers specified via Settings, check legacy properties if (implicit_layers_.count <= 0) { ParseDebugVulkanLayers(); - property_list(ParseDebugVulkanLayer, this); + ParseDebugVulkanLayer(); // sort by priorities auto& arr = implicit_layers_; @@ -181,30 +182,39 @@ class OverrideLayerNames { AddImplicitLayer(prio, p, strlen(p)); } - static void ParseDebugVulkanLayer(const char* key, - const char* val, - void* user_data) { + void ParseDebugVulkanLayer() { + // Checks for consecutive debug.vulkan.layer. system + // properties after always checking an initial fixed range. static const char prefix[] = "debug.vulkan.layer."; - const size_t prefix_len = sizeof(prefix) - 1; - - if (strncmp(key, prefix, prefix_len) || val[0] == '\0') - return; - key += prefix_len; - - // debug.vulkan.layer. - int priority = -1; - if (key[0] >= '0' && key[0] <= '9') - priority = atoi(key); + static constexpr int kFixedRangeBeginInclusive = 0; + static constexpr int kFixedRangeEndInclusive = 9; + + bool logged = false; + + int priority = kFixedRangeBeginInclusive; + while (true) { + const std::string prop_key = + std::string(prefix) + std::to_string(priority); + const std::string prop_val = + android::base::GetProperty(prop_key, ""); + + if (!prop_val.empty()) { + if (!logged) { + ALOGI( + "Detected Vulkan layers configured with " + "debug.vulkan.layer.. Checking for " + "debug.vulkan.layer. in the range [%d, %d] " + "followed by a consecutive scan.", + kFixedRangeBeginInclusive, kFixedRangeEndInclusive); + logged = true; + } + AddImplicitLayer(priority, prop_val.c_str(), prop_val.length()); + } else if (priority >= kFixedRangeEndInclusive) { + return; + } - if (priority < 0) { - ALOGW("Ignored implicit layer %s with invalid priority %s", val, - key); - return; + ++priority; } - - OverrideLayerNames& override_layers = - *reinterpret_cast(user_data); - override_layers.AddImplicitLayer(priority, val, strlen(val)); } void AddImplicitLayer(int priority, const char* name, size_t len) { -- cgit v1.2.3-59-g8ed1b