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

Commit ac136750 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by android-build-merger
Browse files

Merge "Define range of GIDs for cached app data."

am: da94f09e

Change-Id: I5db07df01d02b7612d89bca226536cc6461d44b0
parents 6b1a1bad da94f09e
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -23,19 +23,19 @@
extern "C" {
#endif

// NOTE: keep in sync with android.os.UserId

#define MULTIUSER_APP_PER_USER_RANGE 100000
#define MULTIUSER_FIRST_SHARED_APPLICATION_GID 50000
#define MULTIUSER_FIRST_APPLICATION_UID 10000

typedef uid_t userid_t;
typedef uid_t appid_t;

extern userid_t multiuser_get_user_id(uid_t uid);
extern appid_t multiuser_get_app_id(uid_t uid);
extern uid_t multiuser_get_uid(userid_t userId, appid_t appId);
extern appid_t multiuser_get_shared_app_gid(uid_t uid);

extern uid_t multiuser_get_uid(userid_t user_id, appid_t app_id);

extern gid_t multiuser_get_cache_gid(userid_t user_id, appid_t app_id);
extern gid_t multiuser_get_shared_gid(userid_t user_id, appid_t app_id);

/* TODO: switch callers over to multiuser_get_shared_gid() */
extern gid_t multiuser_get_shared_app_gid(uid_t uid);

#ifdef __cplusplus
}
+12 −6
Original line number Diff line number Diff line
@@ -157,15 +157,21 @@
#define AID_MISC          9998  /* access to misc storage */
#define AID_NOBODY        9999

#define AID_APP          10000  /* first app user */
#define AID_APP              10000 /* TODO: switch users over to AID_APP_START */
#define AID_APP_START        10000 /* first app user */
#define AID_APP_END          19999 /* last app user */

#define AID_CACHE_GID_START  20000 /* start of gids for apps to mark cached data */
#define AID_CACHE_GID_END    29999 /* end of gids for apps to mark cached data */

#define AID_SHARED_GID_START 50000 /* start of gids for apps in each user to share */
#define AID_SHARED_GID_END   59999 /* end of gids for apps in each user to share */

#define AID_ISOLATED_START   99000 /* start of uids for fully isolated sandboxed processes */
#define AID_ISOLATED_END     99999 /* end of uids for fully isolated sandboxed processes */

#define AID_USER        100000  /* offset for uid ranges for each user */

#define AID_SHARED_GID_START 50000 /* start of gids for apps in each user to share */
#define AID_SHARED_GID_END   59999 /* start of gids for apps in each user to share */
#define AID_USER            100000 /* TODO: switch users over to AID_USER_OFFSET */
#define AID_USER_OFFSET     100000 /* offset for uid ranges for each user */

#if !defined(EXCLUDE_FS_CONFIG_STRUCTURES)
/*
+22 −7
Original line number Diff line number Diff line
@@ -15,21 +15,36 @@
 */

#include <cutils/multiuser.h>
#include <private/android_filesystem_config.h>

userid_t multiuser_get_user_id(uid_t uid) {
    return uid / MULTIUSER_APP_PER_USER_RANGE;
    return uid / AID_USER_OFFSET;
}

appid_t multiuser_get_app_id(uid_t uid) {
    return uid % MULTIUSER_APP_PER_USER_RANGE;
    return uid % AID_USER_OFFSET;
}

uid_t multiuser_get_uid(userid_t userId, appid_t appId) {
    return userId * MULTIUSER_APP_PER_USER_RANGE + (appId % MULTIUSER_APP_PER_USER_RANGE);
uid_t multiuser_get_uid(userid_t user_id, appid_t app_id) {
    return (user_id * AID_USER_OFFSET) + (app_id % AID_USER_OFFSET);
}

appid_t multiuser_get_shared_app_gid(uid_t id) {
  return MULTIUSER_FIRST_SHARED_APPLICATION_GID + (id % MULTIUSER_APP_PER_USER_RANGE)
          - MULTIUSER_FIRST_APPLICATION_UID;
gid_t multiuser_get_cache_gid(userid_t user_id, appid_t app_id) {
    if (app_id >= AID_APP_START && app_id <= AID_APP_END) {
        return multiuser_get_uid(user_id, (app_id - AID_APP_START) + AID_CACHE_GID_START);
    } else {
        return -1;
    }
}

gid_t multiuser_get_shared_gid(userid_t user_id, appid_t app_id) {
    if (app_id >= AID_APP_START && app_id <= AID_APP_END) {
        return multiuser_get_uid(user_id, (app_id - AID_APP_START) + AID_SHARED_GID_START);
    } else {
        return -1;
    }
}

gid_t multiuser_get_shared_app_gid(uid_t uid) {
    return multiuser_get_shared_gid(multiuser_get_user_id(uid), multiuser_get_app_id(uid));
}
+2 −1
Original line number Diff line number Diff line
@@ -26,7 +26,8 @@ cc_defaults {
                "trace-dev_test.cpp",
                "test_str_parms.cpp",
                "android_get_control_socket_test.cpp",
                "android_get_control_file_test.cpp"
                "android_get_control_file_test.cpp",
                "multiuser_test.cpp"
            ],
        },

+67 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <cutils/multiuser.h>
#include <gtest/gtest.h>

TEST(MultiuserTest, TestMerge) {
    EXPECT_EQ(0, multiuser_get_uid(0, 0));
    EXPECT_EQ(1000, multiuser_get_uid(0, 1000));
    EXPECT_EQ(10000, multiuser_get_uid(0, 10000));
    EXPECT_EQ(50000, multiuser_get_uid(0, 50000));
    EXPECT_EQ(1000000, multiuser_get_uid(10, 0));
    EXPECT_EQ(1001000, multiuser_get_uid(10, 1000));
    EXPECT_EQ(1010000, multiuser_get_uid(10, 10000));
    EXPECT_EQ(1050000, multiuser_get_uid(10, 50000));
}

TEST(MultiuserTest, TestSplitUser) {
    EXPECT_EQ(0, multiuser_get_user_id(0));
    EXPECT_EQ(0, multiuser_get_user_id(1000));
    EXPECT_EQ(0, multiuser_get_user_id(10000));
    EXPECT_EQ(0, multiuser_get_user_id(50000));
    EXPECT_EQ(10, multiuser_get_user_id(1000000));
    EXPECT_EQ(10, multiuser_get_user_id(1001000));
    EXPECT_EQ(10, multiuser_get_user_id(1010000));
    EXPECT_EQ(10, multiuser_get_user_id(1050000));
}

TEST(MultiuserTest, TestSplitApp) {
    EXPECT_EQ(0, multiuser_get_app_id(0));
    EXPECT_EQ(1000, multiuser_get_app_id(1000));
    EXPECT_EQ(10000, multiuser_get_app_id(10000));
    EXPECT_EQ(50000, multiuser_get_app_id(50000));
    EXPECT_EQ(0, multiuser_get_app_id(1000000));
    EXPECT_EQ(1000, multiuser_get_app_id(1001000));
    EXPECT_EQ(10000, multiuser_get_app_id(1010000));
    EXPECT_EQ(50000, multiuser_get_app_id(1050000));
}

TEST(MultiuserTest, TestCache) {
    EXPECT_EQ(-1, multiuser_get_cache_gid(0, 0));
    EXPECT_EQ(-1, multiuser_get_cache_gid(0, 1000));
    EXPECT_EQ(20000, multiuser_get_cache_gid(0, 10000));
    EXPECT_EQ(-1, multiuser_get_cache_gid(0, 50000));
    EXPECT_EQ(1020000, multiuser_get_cache_gid(10, 10000));
}

TEST(MultiuserTest, TestShared) {
    EXPECT_EQ(-1, multiuser_get_shared_gid(0, 0));
    EXPECT_EQ(-1, multiuser_get_shared_gid(0, 1000));
    EXPECT_EQ(50000, multiuser_get_shared_gid(0, 10000));
    EXPECT_EQ(-1, multiuser_get_shared_gid(0, 50000));
    EXPECT_EQ(1050000, multiuser_get_shared_gid(10, 10000));
}
Loading