From 1902492420825874b12962a10712e653901d120d Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Fri, 22 Jan 2010 16:39:53 -0800 Subject: [PATCH] Make sure to downgrade to app permissions when invoking callbacks The [private] binder interface is called from the system process, so make sure we downgrade to the app's proper identity & permissions before allowing execution to continue into app code. --- core/java/android/app/BackupAgent.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/BackupAgent.java b/core/java/android/app/BackupAgent.java index b207998409465..2a586777ddf36 100644 --- a/core/java/android/app/BackupAgent.java +++ b/core/java/android/app/BackupAgent.java @@ -21,6 +21,7 @@ import android.backup.BackupDataInput; import android.backup.BackupDataOutput; import android.content.Context; import android.content.ContextWrapper; +import android.os.Binder; import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; @@ -116,7 +117,9 @@ public abstract class BackupAgent extends ContextWrapper { public void doBackup(ParcelFileDescriptor oldState, ParcelFileDescriptor data, ParcelFileDescriptor newState) throws RemoteException { - // !!! TODO - real implementation; for now just invoke the callbacks directly + // Ensure that we're running with the app's normal permission level + long token = Binder.clearCallingIdentity(); + if (DEBUG) Log.v(TAG, "doBackup() invoked"); BackupDataOutput output = new BackupDataOutput(data.getFileDescriptor()); try { @@ -127,12 +130,16 @@ public abstract class BackupAgent extends ContextWrapper { } catch (RuntimeException ex) { Log.d(TAG, "onBackup (" + BackupAgent.this.getClass().getName() + ") threw", ex); throw ex; + } finally { + Binder.restoreCallingIdentity(token); } } public void doRestore(ParcelFileDescriptor data, int appVersionCode, ParcelFileDescriptor newState) throws RemoteException { - // !!! TODO - real implementation; for now just invoke the callbacks directly + // Ensure that we're running with the app's normal permission level + long token = Binder.clearCallingIdentity(); + if (DEBUG) Log.v(TAG, "doRestore() invoked"); BackupDataInput input = new BackupDataInput(data.getFileDescriptor()); try { @@ -143,6 +150,8 @@ public abstract class BackupAgent extends ContextWrapper { } catch (RuntimeException ex) { Log.d(TAG, "onRestore (" + BackupAgent.this.getClass().getName() + ") threw", ex); throw ex; + } finally { + Binder.restoreCallingIdentity(token); } } }