From f88ebeb2506d3daed3fe0a71f6e1f5cde34406cd Mon Sep 17 00:00:00 2001 From: Sudheer Shanka Date: Tue, 14 Feb 2017 18:30:40 -0800 Subject: [PATCH] Use correct packageName for checking if it belongs to callingUid. In AccountManagerService.getAccountsAsUser, we check if opPackageName belongs to calling uid by calling AppOpsManager.checkPackage. But when AccountManagerService.getAccountsAsUser is called from AccountManagerService.addSharedAccountsFromParentUser, we're using the opPackageName from system context instead of calling context. Bug: 35258008 Test: cts-tradefed run singleCommand cts-dev --module CtsMultiUserHostTestCases \ -t android.host.multiuser.CreateUsersPermissionTest#testCanCreateRestrictedUser Change-Id: I5c425d9314beb86f7c64a5b5c64b7d879711879a --- cmds/pm/src/com/android/commands/pm/Pm.java | 4 +++- core/java/android/accounts/AccountManager.java | 2 +- core/java/android/accounts/IAccountManager.aidl | 2 +- .../com/android/server/accounts/AccountManagerService.java | 5 +++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index 7015381dc4fbe..b336472666bd8 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -53,6 +53,7 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.IUserManager; import android.os.ParcelFileDescriptor; +import android.os.Process; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.SELinux; @@ -1004,7 +1005,8 @@ public final class Pm { // In non-split user mode, userId can only be SYSTEM int parentUserId = userId >= 0 ? userId : UserHandle.USER_SYSTEM; info = mUm.createRestrictedProfile(name, parentUserId); - mAm.addSharedAccountsFromParentUser(parentUserId, userId); + mAm.addSharedAccountsFromParentUser(parentUserId, userId, + (Process.myUid() == Process.ROOT_UID) ? "root" : "com.android.shell"); } else if (userId < 0) { info = mUm.createUser(name, flags); } else { diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index 02636819781a9..7d039ef221d7f 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -1802,7 +1802,7 @@ public class AccountManager { public void addSharedAccountsFromParentUser(UserHandle parentUser, UserHandle user) { try { mService.addSharedAccountsFromParentUser(parentUser.getIdentifier(), - user.getIdentifier()); + user.getIdentifier(), mContext.getOpPackageName()); } catch (RemoteException re) { throw re.rethrowFromSystemServer(); } diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl index e0fdac146f68a..49cd2c6a3953f 100644 --- a/core/java/android/accounts/IAccountManager.aidl +++ b/core/java/android/accounts/IAccountManager.aidl @@ -80,7 +80,7 @@ interface IAccountManager { /* Shared accounts */ Account[] getSharedAccountsAsUser(int userId); boolean removeSharedAccountAsUser(in Account account, int userId); - void addSharedAccountsFromParentUser(int parentUserId, int userId); + void addSharedAccountsFromParentUser(int parentUserId, int userId, String opPackageName); /* Account renaming. */ void renameAccount(in IAccountManagerResponse response, in Account accountToRename, String newName); diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index fbc4440265391..5c8024ac31706 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -4087,9 +4087,10 @@ public class AccountManagerService } @Override - public void addSharedAccountsFromParentUser(int parentUserId, int userId) { + public void addSharedAccountsFromParentUser(int parentUserId, int userId, + String opPackageName) { checkManageOrCreateUsersPermission("addSharedAccountsFromParentUser"); - Account[] accounts = getAccountsAsUser(null, parentUserId, mContext.getOpPackageName()); + Account[] accounts = getAccountsAsUser(null, parentUserId, opPackageName); for (Account account : accounts) { addSharedAccountAsUser(account, userId); }