diff options
author | Christopher Tate <ctate@google.com> | 2012-09-14 13:34:17 -0700 |
---|---|---|
committer | Christopher Tate <ctate@google.com> | 2012-09-14 13:43:16 -0700 |
commit | ad9833a77ff4deb5352c67800c2ee62ed6e51356 (patch) | |
tree | e6019a70f5a91a9df9a855c2d2e861773f902034 /services/java/com/android/server | |
parent | e136a72810197029a01b4e30b2063d9993b7a9ad (diff) | |
download | frameworks_base-ad9833a77ff4deb5352c67800c2ee62ed6e51356.zip frameworks_base-ad9833a77ff4deb5352c67800c2ee62ed6e51356.tar.gz frameworks_base-ad9833a77ff4deb5352c67800c2ee62ed6e51356.tar.bz2 |
Get correct user's package info during clip processing
Also clear the binder identity correctly for purposes of doing
that query.
Bug 7162477
Change-Id: Ie9e43a2d8fc964d1be649887905244dcceaa3c80
Diffstat (limited to 'services/java/com/android/server')
-rw-r--r-- | services/java/com/android/server/ClipboardService.java | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/services/java/com/android/server/ClipboardService.java b/services/java/com/android/server/ClipboardService.java index 0bf7aad..74ec6e2 100644 --- a/services/java/com/android/server/ClipboardService.java +++ b/services/java/com/android/server/ClipboardService.java @@ -17,6 +17,7 @@ package com.android.server; import android.app.ActivityManagerNative; +import android.app.AppGlobals; import android.app.IActivityManager; import android.content.BroadcastReceiver; import android.content.ClipData; @@ -26,6 +27,7 @@ import android.content.IOnPrimaryClipChangedListener; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; @@ -120,7 +122,6 @@ public class ClipboardService extends IClipboard.Stub { private PerUserClipboard getClipboard(int userId) { synchronized (mClipboards) { - Slog.i(TAG, "Got clipboard for user=" + userId); PerUserClipboard puc = mClipboards.get(userId); if (puc == null) { puc = new PerUserClipboard(userId); @@ -255,15 +256,22 @@ public class ClipboardService extends IClipboard.Stub { } private final void addActiveOwnerLocked(int uid, String pkg) { - PackageInfo pi; + final IPackageManager pm = AppGlobals.getPackageManager(); + final int targetUserHandle = UserHandle.getCallingUserId(); + final long oldIdentity = Binder.clearCallingIdentity(); try { - pi = mPm.getPackageInfo(pkg, 0); + PackageInfo pi = pm.getPackageInfo(pkg, 0, targetUserHandle); + if (pi == null) { + throw new IllegalArgumentException("Unknown package " + pkg); + } if (!UserHandle.isSameApp(pi.applicationInfo.uid, uid)) { throw new SecurityException("Calling uid " + uid + " does not own package " + pkg); } - } catch (NameNotFoundException e) { - throw new IllegalArgumentException("Unknown package " + pkg, e); + } catch (RemoteException e) { + // Can't happen; the package manager is in the same process + } finally { + Binder.restoreCallingIdentity(oldIdentity); } PerUserClipboard clipboard = getClipboard(); if (clipboard.primaryClip != null && !clipboard.activePermissionOwners.contains(pkg)) { |