diff options
Diffstat (limited to 'gatekeeperd/gatekeeperd.cpp')
-rw-r--r-- | gatekeeperd/gatekeeperd.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/gatekeeperd/gatekeeperd.cpp b/gatekeeperd/gatekeeperd.cpp index 9788681..b4fdab0 100644 --- a/gatekeeperd/gatekeeperd.cpp +++ b/gatekeeperd/gatekeeperd.cpp @@ -40,6 +40,7 @@ #include <hardware/hw_auth_token.h> #include "SoftGateKeeperDevice.h" +#include "IUserManager.h" namespace android { @@ -263,7 +264,21 @@ public: } virtual uint64_t getSecureUserId(uint32_t uid) { - return read_sid(uid); + uint64_t sid = read_sid(uid); + if (sid == 0) { + // might be a work profile, look up the parent + sp<IServiceManager> sm = defaultServiceManager(); + sp<IBinder> binder = sm->getService(String16("user")); + sp<IUserManager> um = interface_cast<IUserManager>(binder); + int32_t parent = um->getCredentialOwnerProfile(uid); + if (parent < 0) { + return 0; + } else if (parent != (int32_t) uid) { + return read_sid(parent); + } + } + return sid; + } virtual void clearSecureUserId(uint32_t uid) { |