Move native vold calls to varargs.

Uses argument escaping inside NativeDaemonConnector, using varargs
to separate boundaries.

Bug: 5472606
Change-Id: Ie107a90df7e2b3bd3eaaf04c8367248ab40136f4
This commit is contained in:
Jeff Sharkey
2011-12-02 14:11:21 -08:00
parent 7ea817e58d
commit dd519fac9b

View File

@@ -20,6 +20,7 @@ import com.android.internal.app.IMediaContainerService;
import com.android.internal.util.XmlUtils;
import com.android.server.am.ActivityManagerService;
import com.android.server.pm.PackageManagerService;
import com.android.server.NativeDaemonConnector.Command;
import android.Manifest;
import android.content.BroadcastReceiver;
@@ -564,8 +565,7 @@ class MountService extends IMountService.Stub
}
try {
mConnector.doCommand(String.format(
"volume %sshare %s %s", (enable ? "" : "un"), path, method));
mConnector.execute("volume", enable ? "share" : "unshare", path, method);
} catch (NativeDaemonConnectorException e) {
Slog.e(TAG, "Failed to share/unshare", e);
}
@@ -633,8 +633,9 @@ class MountService extends IMountService.Stub
* Determine media state and UMS detection status
*/
try {
String[] vols = mConnector.doListCommand(
"volume list", VoldResponseCode.VolumeListResult);
final String[] vols = NativeDaemonEvent.filterMessageList(
mConnector.executeForList("volume", "list"),
VoldResponseCode.VolumeListResult);
for (String volstr : vols) {
String[] tok = volstr.split(" ");
// FMT: <label> <mountpoint> <state>
@@ -839,7 +840,7 @@ class MountService extends IMountService.Stub
if (DEBUG_EVENTS) Slog.i(TAG, "doMountVolume: Mouting " + path);
try {
mConnector.doCommand(String.format("volume mount %s", path));
mConnector.execute("volume", "mount", path);
} catch (NativeDaemonConnectorException e) {
/*
* Mount failed for some reason
@@ -909,10 +910,13 @@ class MountService extends IMountService.Stub
// Redundant probably. But no harm in updating state again.
mPms.updateExternalMediaStatus(false, false);
try {
String arg = removeEncryption
? " force_and_revert"
: (force ? " force" : "");
mConnector.doCommand(String.format("volume unmount %s%s", path, arg));
final Command cmd = new Command("volume", "unmount", path);
if (removeEncryption) {
cmd.appendArg("force_and_revert");
} else if (force) {
cmd.appendArg("force");
}
mConnector.execute(cmd);
// We unmounted the volume. None of the asec containers are available now.
synchronized (mAsecMountSet) {
mAsecMountSet.clear();
@@ -934,8 +938,7 @@ class MountService extends IMountService.Stub
private int doFormatVolume(String path) {
try {
String cmd = String.format("volume format %s", path);
mConnector.doCommand(cmd);
mConnector.execute("volume", "format", path);
return StorageResultCode.OperationSucceeded;
} catch (NativeDaemonConnectorException e) {
int code = e.getCode();
@@ -950,39 +953,19 @@ class MountService extends IMountService.Stub
}
private boolean doGetVolumeShared(String path, String method) {
String cmd = String.format("volume shared %s %s", path, method);
ArrayList<String> rsp;
final NativeDaemonEvent event;
try {
rsp = mConnector.doCommand(cmd);
event = mConnector.execute("volume", "shared", path, method);
} catch (NativeDaemonConnectorException ex) {
Slog.e(TAG, "Failed to read response to volume shared " + path + " " + method);
return false;
}
for (String line : rsp) {
String[] tok = line.split(" ");
if (tok.length < 3) {
Slog.e(TAG, "Malformed response to volume shared " + path + " " + method + " command");
return false;
}
int code;
try {
code = Integer.parseInt(tok[0]);
} catch (NumberFormatException nfe) {
Slog.e(TAG, String.format("Error parsing code %s", tok[0]));
return false;
}
if (code == VoldResponseCode.ShareEnabledResult) {
return "enabled".equals(tok[2]);
} else {
Slog.e(TAG, String.format("Unexpected response code %d", code));
return false;
}
if (event.getCode() == VoldResponseCode.ShareEnabledResult) {
return event.getMessage().endsWith("enabled");
} else {
return false;
}
Slog.e(TAG, "Got an empty response");
return false;
}
private void notifyShareAvailabilityChange(final boolean avail) {
@@ -1410,13 +1393,14 @@ class MountService extends IMountService.Stub
validatePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS);
waitForReady();
try {
String[] r = mConnector.doListCommand(
String.format("storage users %s", path),
VoldResponseCode.StorageUsersListResult);
final String[] r = NativeDaemonEvent.filterMessageList(
mConnector.executeForList("storage", "users", path),
VoldResponseCode.StorageUsersListResult);
// FMT: <pid> <process name>
int[] data = new int[r.length];
for (int i = 0; i < r.length; i++) {
String []tok = r[i].split(" ");
String[] tok = r[i].split(" ");
try {
data[i] = Integer.parseInt(tok[0]);
} catch (NumberFormatException nfe) {
@@ -1443,7 +1427,8 @@ class MountService extends IMountService.Stub
warnOnNotMounted();
try {
return mConnector.doListCommand("asec list", VoldResponseCode.AsecListResult);
return NativeDaemonEvent.filterMessageList(
mConnector.executeForList("asec", "list"), VoldResponseCode.AsecListResult);
} catch (NativeDaemonConnectorException e) {
return new String[0];
}
@@ -1456,9 +1441,8 @@ class MountService extends IMountService.Stub
warnOnNotMounted();
int rc = StorageResultCode.OperationSucceeded;
String cmd = String.format("asec create %s %d %s %s %d", id, sizeMb, fstype, key, ownerUid);
try {
mConnector.doCommand(cmd);
mConnector.execute("asec", "create", id, sizeMb, fstype, key, ownerUid);
} catch (NativeDaemonConnectorException e) {
rc = StorageResultCode.OperationFailedInternalError;
}
@@ -1477,7 +1461,7 @@ class MountService extends IMountService.Stub
int rc = StorageResultCode.OperationSucceeded;
try {
mConnector.doCommand(String.format("asec finalize %s", id));
mConnector.execute("asec", "finalize", id);
/*
* Finalization does a remount, so no need
* to update mAsecMountSet
@@ -1503,7 +1487,11 @@ class MountService extends IMountService.Stub
int rc = StorageResultCode.OperationSucceeded;
try {
mConnector.doCommand(String.format("asec destroy %s%s", id, (force ? " force" : "")));
final Command cmd = new Command("asec", "destroy", id);
if (force) {
cmd.appendArg("force");
}
mConnector.execute(cmd);
} catch (NativeDaemonConnectorException e) {
int code = e.getCode();
if (code == VoldResponseCode.OpFailedStorageBusy) {
@@ -1536,9 +1524,8 @@ class MountService extends IMountService.Stub
}
int rc = StorageResultCode.OperationSucceeded;
String cmd = String.format("asec mount %s %s %d", id, key, ownerUid);
try {
mConnector.doCommand(cmd);
mConnector.execute("asec", "mount", id, key, ownerUid);
} catch (NativeDaemonConnectorException e) {
int code = e.getCode();
if (code != VoldResponseCode.OpFailedStorageBusy) {
@@ -1574,9 +1561,12 @@ class MountService extends IMountService.Stub
Runtime.getRuntime().gc();
int rc = StorageResultCode.OperationSucceeded;
String cmd = String.format("asec unmount %s%s", id, (force ? " force" : ""));
try {
mConnector.doCommand(cmd);
final Command cmd = new Command("asec", "unmount", id);
if (force) {
cmd.appendArg("force");
}
mConnector.execute(cmd);
} catch (NativeDaemonConnectorException e) {
int code = e.getCode();
if (code == VoldResponseCode.OpFailedStorageBusy) {
@@ -1620,9 +1610,8 @@ class MountService extends IMountService.Stub
}
int rc = StorageResultCode.OperationSucceeded;
String cmd = String.format("asec rename %s %s", oldId, newId);
try {
mConnector.doCommand(cmd);
mConnector.execute("asec", "rename", oldId, newId);
} catch (NativeDaemonConnectorException e) {
rc = StorageResultCode.OperationFailedInternalError;
}
@@ -1635,14 +1624,11 @@ class MountService extends IMountService.Stub
waitForReady();
warnOnNotMounted();
final NativeDaemonEvent event;
try {
ArrayList<String> rsp = mConnector.doCommand(String.format("asec path %s", id));
String []tok = rsp.get(0).split(" ");
int code = Integer.parseInt(tok[0]);
if (code != VoldResponseCode.AsecPathResult) {
throw new IllegalStateException(String.format("Unexpected response code %d", code));
}
return tok[1];
event = mConnector.execute("asec", "path", id);
event.checkCode(VoldResponseCode.AsecPathResult);
return event.getMessage();
} catch (NativeDaemonConnectorException e) {
int code = e.getCode();
if (code == VoldResponseCode.OpFailedStorageNotFound) {
@@ -1659,14 +1645,11 @@ class MountService extends IMountService.Stub
waitForReady();
warnOnNotMounted();
final NativeDaemonEvent event;
try {
ArrayList<String> rsp = mConnector.doCommand(String.format("asec fspath %s", id));
String []tok = rsp.get(0).split(" ");
int code = Integer.parseInt(tok[0]);
if (code != VoldResponseCode.AsecPathResult) {
throw new IllegalStateException(String.format("Unexpected response code %d", code));
}
return tok[1];
event = mConnector.execute("asec", "fspath", id);
event.checkCode(VoldResponseCode.AsecPathResult);
return event.getMessage();
} catch (NativeDaemonConnectorException e) {
int code = e.getCode();
if (code == VoldResponseCode.OpFailedStorageNotFound) {
@@ -1709,14 +1692,11 @@ class MountService extends IMountService.Stub
waitForReady();
warnOnNotMounted();
final NativeDaemonEvent event;
try {
ArrayList<String> rsp = mConnector.doCommand(String.format("obb path %s", filename));
String []tok = rsp.get(0).split(" ");
int code = Integer.parseInt(tok[0]);
if (code != VoldResponseCode.AsecPathResult) {
throw new IllegalStateException(String.format("Unexpected response code %d", code));
}
return tok[1];
event = mConnector.execute("obb", "path", filename);
event.checkCode(VoldResponseCode.AsecPathResult);
return event.getMessage();
} catch (NativeDaemonConnectorException e) {
int code = e.getCode();
if (code == VoldResponseCode.OpFailedStorageNotFound) {
@@ -1778,18 +1758,10 @@ class MountService extends IMountService.Stub
waitForReady();
final NativeDaemonEvent event;
try {
ArrayList<String> rsp = mConnector.doCommand("cryptfs cryptocomplete");
String[] tokens = rsp.get(0).split(" ");
if (tokens == null || tokens.length != 2) {
// Unexpected.
Slog.w(TAG, "Unexpected result from cryptfs cryptocomplete");
return ENCRYPTION_STATE_ERROR_UNKNOWN;
}
return Integer.parseInt(tokens[1]);
event = mConnector.execute("cryptfs", "cryptocomplete");
return Integer.parseInt(event.getMessage());
} catch (NumberFormatException e) {
// Bad result - unexpected.
Slog.w(TAG, "Unable to parse result from cryptfs cryptocomplete");
@@ -1816,23 +1788,18 @@ class MountService extends IMountService.Stub
Slog.i(TAG, "decrypting storage...");
}
final NativeDaemonEvent event;
try {
ArrayList<String> rsp = mConnector.doCommand("cryptfs checkpw " + password);
String[] tokens = rsp.get(0).split(" ");
if (tokens == null || tokens.length != 2) {
return -1;
}
int code = Integer.parseInt(tokens[1]);
event = mConnector.execute("cryptfs", "checkpw", password);
final int code = event.getCode();
if (code == 0) {
// Decrypt was successful. Post a delayed message before restarting in order
// to let the UI to clear itself
mHandler.postDelayed(new Runnable() {
public void run() {
try {
mConnector.doCommand(String.format("cryptfs restart"));
mConnector.execute("cryptfs", "restart");
} catch (NativeDaemonConnectorException e) {
Slog.e(TAG, "problem executing in background", e);
}
@@ -1862,7 +1829,7 @@ class MountService extends IMountService.Stub
}
try {
mConnector.doCommand(String.format("cryptfs enablecrypto inplace %s", password));
mConnector.execute("cryptfs", "enablecrypto", "inplace", password);
} catch (NativeDaemonConnectorException e) {
// Encryption failed
return e.getCode();
@@ -1885,16 +1852,10 @@ class MountService extends IMountService.Stub
Slog.i(TAG, "changing encryption password...");
}
final NativeDaemonEvent event;
try {
ArrayList<String> response = mConnector.doCommand("cryptfs changepw " + password);
String[] tokens = response.get(0).split(" ");
if (tokens == null || tokens.length != 2) {
return -1;
}
return Integer.parseInt(tokens[1]);
event = mConnector.execute("cryptfs", "changepw", password);
return Integer.parseInt(event.getMessage());
} catch (NativeDaemonConnectorException e) {
// Encryption failed
return e.getCode();
@@ -1924,24 +1885,11 @@ class MountService extends IMountService.Stub
Slog.i(TAG, "validating encryption password...");
}
final NativeDaemonEvent event;
try {
ArrayList<String> response = mConnector.doCommand("cryptfs verifypw " + password);
String[] tokens = response.get(0).split(" ");
if (tokens == null || tokens.length != 2) {
String msg = "Unexpected result from cryptfs verifypw: {";
if (tokens == null) msg += "null";
else for (int i = 0; i < tokens.length; i++) {
if (i != 0) msg += ',';
msg += tokens[i];
}
msg += '}';
Slog.e(TAG, msg);
return -1;
}
Slog.i(TAG, "cryptfs verifypw => " + tokens[1]);
return Integer.parseInt(tokens[1]);
event = mConnector.execute("cryptfs", "verifypw", password);
Slog.i(TAG, "cryptfs verifypw => " + event.getMessage());
return Integer.parseInt(event.getMessage());
} catch (NativeDaemonConnectorException e) {
// Encryption failed
return e.getCode();
@@ -2300,10 +2248,9 @@ class MountService extends IMountService.Stub
}
int rc = StorageResultCode.OperationSucceeded;
String cmd = String.format("obb mount %s %s %d", mObbState.filename, hashedKey,
mObbState.callerUid);
try {
mConnector.doCommand(cmd);
mConnector.execute(
"obb", "mount", mObbState.filename, hashedKey, mObbState.callerUid);
} catch (NativeDaemonConnectorException e) {
int code = e.getCode();
if (code != VoldResponseCode.OpFailedStorageBusy) {
@@ -2384,10 +2331,12 @@ class MountService extends IMountService.Stub
mObbState.filename = obbInfo.filename;
int rc = StorageResultCode.OperationSucceeded;
String cmd = String.format("obb unmount %s%s", mObbState.filename,
(mForceUnmount ? " force" : ""));
try {
mConnector.doCommand(cmd);
final Command cmd = new Command("obb", "unmount", mObbState.filename);
if (mForceUnmount) {
cmd.appendArg("force");
}
mConnector.execute(cmd);
} catch (NativeDaemonConnectorException e) {
int code = e.getCode();
if (code == VoldResponseCode.OpFailedStorageBusy) {