(DO NOT MERGE) Fix pub issue #58043: Copy crash in Android 4.3...
...when clipboard listener attached We need to clear the calling identity before dispatching change notifications. Also make this more robust, so that in the face of any failure we will clean up the broadcast state. Integrated from master. Change-Id: I05e1f76ffd486439535631fe4062dabe94bd2ccf
This commit is contained in:
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package android.app;
|
package android.app;
|
||||||
|
|
||||||
|
import android.R;
|
||||||
import com.android.internal.app.IUsageStats;
|
import com.android.internal.app.IUsageStats;
|
||||||
import com.android.internal.os.PkgUsageStats;
|
import com.android.internal.os.PkgUsageStats;
|
||||||
import com.android.internal.util.MemInfoReader;
|
import com.android.internal.util.MemInfoReader;
|
||||||
@ -369,9 +370,9 @@ public class ActivityManager {
|
|||||||
// Really brain dead right now -- just take this from the configured
|
// Really brain dead right now -- just take this from the configured
|
||||||
// vm heap size, and assume it is in megabytes and thus ends with "m".
|
// vm heap size, and assume it is in megabytes and thus ends with "m".
|
||||||
String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
|
String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
|
||||||
return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
|
return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length() - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used by persistent processes to determine if they are running on a
|
* Used by persistent processes to determine if they are running on a
|
||||||
* higher-end device so should be okay using hardware drawing acceleration
|
* higher-end device so should be okay using hardware drawing acceleration
|
||||||
|
@ -154,31 +154,36 @@ public class ClipboardService extends IClipboard.Stub {
|
|||||||
if (clip != null && clip.getItemCount() <= 0) {
|
if (clip != null && clip.getItemCount() <= 0) {
|
||||||
throw new IllegalArgumentException("No items");
|
throw new IllegalArgumentException("No items");
|
||||||
}
|
}
|
||||||
if (mAppOps.noteOp(AppOpsManager.OP_WRITE_CLIPBOARD, Binder.getCallingUid(),
|
final int callingUid = Binder.getCallingUid();
|
||||||
|
if (mAppOps.noteOp(AppOpsManager.OP_WRITE_CLIPBOARD, callingUid,
|
||||||
callingPackage) != AppOpsManager.MODE_ALLOWED) {
|
callingPackage) != AppOpsManager.MODE_ALLOWED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
checkDataOwnerLocked(clip, Binder.getCallingUid());
|
checkDataOwnerLocked(clip, callingUid);
|
||||||
clearActiveOwnersLocked();
|
clearActiveOwnersLocked();
|
||||||
PerUserClipboard clipboard = getClipboard();
|
PerUserClipboard clipboard = getClipboard();
|
||||||
clipboard.primaryClip = clip;
|
clipboard.primaryClip = clip;
|
||||||
|
final long ident = Binder.clearCallingIdentity();
|
||||||
final int n = clipboard.primaryClipListeners.beginBroadcast();
|
final int n = clipboard.primaryClipListeners.beginBroadcast();
|
||||||
for (int i = 0; i < n; i++) {
|
try {
|
||||||
try {
|
for (int i = 0; i < n; i++) {
|
||||||
ListenerInfo li = (ListenerInfo)
|
try {
|
||||||
clipboard.primaryClipListeners.getBroadcastCookie(i);
|
ListenerInfo li = (ListenerInfo)
|
||||||
if (mAppOps.checkOpNoThrow(AppOpsManager.OP_READ_CLIPBOARD, li.mUid,
|
clipboard.primaryClipListeners.getBroadcastCookie(i);
|
||||||
li.mPackageName) == AppOpsManager.MODE_ALLOWED) {
|
if (mAppOps.checkOpNoThrow(AppOpsManager.OP_READ_CLIPBOARD, li.mUid,
|
||||||
clipboard.primaryClipListeners.getBroadcastItem(i)
|
li.mPackageName) == AppOpsManager.MODE_ALLOWED) {
|
||||||
.dispatchPrimaryClipChanged();
|
clipboard.primaryClipListeners.getBroadcastItem(i)
|
||||||
|
.dispatchPrimaryClipChanged();
|
||||||
|
}
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
// The RemoteCallbackList will take care of removing
|
||||||
|
// the dead object for us.
|
||||||
}
|
}
|
||||||
} catch (RemoteException e) {
|
|
||||||
|
|
||||||
// The RemoteCallbackList will take care of removing
|
|
||||||
// the dead object for us.
|
|
||||||
}
|
}
|
||||||
|
} finally {
|
||||||
|
clipboard.primaryClipListeners.finishBroadcast();
|
||||||
|
Binder.restoreCallingIdentity(ident);
|
||||||
}
|
}
|
||||||
clipboard.primaryClipListeners.finishBroadcast();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user