Merge "Add shell commands to start checkpoint/check it is supported"

This commit is contained in:
Nikita Ioffe
2020-01-15 18:16:29 +00:00
committed by Android (Google) Code Review
2 changed files with 33 additions and 2 deletions

View File

@@ -103,6 +103,10 @@ public final class Sm {
runSetVirtualDisk();
} else if ("set-isolated-storage".equals(op)) {
runIsolatedStorage();
} else if ("start-checkpoint".equals(op)) {
runStartCheckpoint();
} else if ("supports-checkpoint".equals(op)) {
runSupportsCheckpoint();
} else {
throw new IllegalArgumentException();
}
@@ -313,6 +317,27 @@ public final class Sm {
}
}
private void runStartCheckpoint() throws RemoteException {
final String numRetriesString = nextArg();
if (numRetriesString == null) {
throw new IllegalArgumentException("Expected <num-retries>");
}
int numRetries;
try {
numRetries = Integer.parseInt(numRetriesString);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("<num-retries> must be a positive integer");
}
if (numRetries <= 0) {
throw new IllegalArgumentException("<num-retries> must be a positive integer");
}
mSm.startCheckpoint(numRetries);
}
private void runSupportsCheckpoint() throws RemoteException {
System.out.println(mSm.supportsCheckpoint());
}
private String nextArg() {
if (mNextArg >= mArgs.length) {
return null;
@@ -344,6 +369,10 @@ public final class Sm {
System.err.println("");
System.err.println(" sm set-isolated-storage [on|off|default]");
System.err.println("");
System.err.println(" sm start-checkpoint <num-retries>");
System.err.println("");
System.err.println(" sm supports-checkpoint");
System.err.println("");
return 1;
}
}

View File

@@ -2855,8 +2855,10 @@ class StorageManagerService extends IStorageManager.Stub
*/
@Override
public void startCheckpoint(int numTries) throws RemoteException {
// Only the system process is permitted to start checkpoints
if (Binder.getCallingUid() != android.os.Process.SYSTEM_UID) {
// Only the root, system_server and shell processes are permitted to start checkpoints
final int callingUid = Binder.getCallingUid();
if (callingUid != Process.SYSTEM_UID && callingUid != Process.ROOT_UID
&& callingUid != Process.SHELL_UID) {
throw new SecurityException("no permission to start filesystem checkpoint");
}