Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 01b92c78 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

Avoid string allocations when checking for permissions

Fixes: 334988349
Test: presubmit, pprof
Change-Id: Id960aa7356ac927e57aa92a704de8691a996ab59
parent 06bf5557
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -23,31 +23,31 @@
#include <gui/LayerState.h>

namespace android {
std::unordered_map<std::string, int> LayerStatePermissions::mPermissionMap = {
std::vector<std::pair<String16, int>> LayerStatePermissions::mPermissionMap = {
        // If caller has ACCESS_SURFACE_FLINGER, they automatically get ROTATE_SURFACE_FLINGER
        // permission, as well
        {"android.permission.ACCESS_SURFACE_FLINGER",
        {String16("android.permission.ACCESS_SURFACE_FLINGER"),
         layer_state_t::Permission::ACCESS_SURFACE_FLINGER |
                 layer_state_t::Permission::ROTATE_SURFACE_FLINGER},
        {"android.permission.ROTATE_SURFACE_FLINGER",
        {String16("android.permission.ROTATE_SURFACE_FLINGER"),
         layer_state_t::Permission::ROTATE_SURFACE_FLINGER},
        {"android.permission.INTERNAL_SYSTEM_WINDOW",
        {String16("android.permission.INTERNAL_SYSTEM_WINDOW"),
         layer_state_t::Permission::INTERNAL_SYSTEM_WINDOW},
};

static bool callingThreadHasPermission(const std::string& permission __attribute__((unused)),
static bool callingThreadHasPermission(const String16& permission __attribute__((unused)),
                                       int pid __attribute__((unused)),
                                       int uid __attribute__((unused))) {
#ifndef __ANDROID_VNDK__
    return uid == AID_GRAPHICS || uid == AID_SYSTEM ||
            PermissionCache::checkPermission(String16(permission.c_str()), pid, uid);
            PermissionCache::checkPermission(permission, pid, uid);
#endif // __ANDROID_VNDK__
    return false;
}

uint32_t LayerStatePermissions::getTransactionPermissions(int pid, int uid) {
    uint32_t permissions = 0;
    for (auto [permissionName, permissionVal] : mPermissionMap) {
    for (const auto& [permissionName, permissionVal] : mPermissionMap) {
        if (callingThreadHasPermission(permissionName, pid, uid)) {
            permissions |= permissionVal;
        }
+3 −4
Original line number Diff line number Diff line
@@ -15,15 +15,14 @@
 */

#include <stdint.h>
#include <string>
#include <unordered_map>

#include <utils/String16.h>
#include <vector>
namespace android {
class LayerStatePermissions {
public:
    static uint32_t getTransactionPermissions(int pid, int uid);

private:
    static std::unordered_map<std::string, int> mPermissionMap;
    static std::vector<std::pair<String16, int>> mPermissionMap;
};
} // namespace android
 No newline at end of file