Merge "vdc: fix segfault"
diff --git a/CommandListener.cpp b/CommandListener.cpp
index 1177602..3e984a1 100644
--- a/CommandListener.cpp
+++ b/CommandListener.cpp
@@ -526,6 +526,21 @@
VoldCommand("cryptfs") {
}
+static int getType(const char* type)
+{
+ if (!strcmp(type, "default")) {
+ return CRYPT_TYPE_DEFAULT;
+ } else if (!strcmp(type, "password")) {
+ return CRYPT_TYPE_PASSWORD;
+ } else if (!strcmp(type, "pin")) {
+ return CRYPT_TYPE_PIN;
+ } else if (!strcmp(type, "pattern")) {
+ return CRYPT_TYPE_PATTERN;
+ } else {
+ return -1;
+ }
+}
+
int CommandListener::CryptfsCmd::runCommand(SocketClient *cli,
int argc, char **argv) {
if ((cli->getUid() != 0) && (cli->getUid() != AID_SYSTEM)) {
@@ -562,21 +577,28 @@
dumpArgs(argc, argv, -1);
rc = cryptfs_crypto_complete();
} else if (!strcmp(argv[1], "enablecrypto")) {
- if ( (argc != 4 && argc != 3)
+ const char* syntax = "Usage: cryptfs enablecrypto <wipe|inplace> "
+ "default|password|pin|pattern [passwd]";
+ if ( (argc != 4 && argc != 5)
|| (strcmp(argv[2], "wipe") && strcmp(argv[2], "inplace")) ) {
- cli->sendMsg(ResponseCode::CommandSyntaxError,
- "Usage: cryptfs enablecrypto <wipe|inplace> [passwd]",
- false);
+ cli->sendMsg(ResponseCode::CommandSyntaxError, syntax, false);
return 0;
}
- dumpArgs(argc, argv, 3);
+ dumpArgs(argc, argv, 4);
int tries;
for (tries = 0; tries < 2; ++tries) {
- if(argc == 3)
- rc = cryptfs_enable_default(argv[2], /*allow_reboot*/false);
- else
- rc = cryptfs_enable(argv[2], argv[3], /*allow_reboot*/false);
+ int type = getType(argv[3]);
+ if (type == -1) {
+ cli->sendMsg(ResponseCode::CommandSyntaxError, syntax,
+ false);
+ return 0;
+ } else if (type == CRYPT_TYPE_DEFAULT) {
+ rc = cryptfs_enable_default(argv[2], /*allow_reboot*/false);
+ } else {
+ rc = cryptfs_enable(argv[2], type, argv[4],
+ /*allow_reboot*/false);
+ }
if (rc == 0) {
break;
@@ -596,16 +618,8 @@
cli->sendMsg(ResponseCode::CommandSyntaxError, syntax, false);
return 0;
}
- int type = 0;
- if (!strcmp(argv[2], "default")) {
- type = CRYPT_TYPE_DEFAULT;
- } else if (!strcmp(argv[2], "password")) {
- type = CRYPT_TYPE_PASSWORD;
- } else if (!strcmp(argv[2], "pin")) {
- type = CRYPT_TYPE_PIN;
- } else if (!strcmp(argv[2], "pattern")) {
- type = CRYPT_TYPE_PATTERN;
- } else {
+ int type = getType(argv[2]);
+ if (type == -1) {
cli->sendMsg(ResponseCode::CommandSyntaxError, syntax, false);
return 0;
}
diff --git a/cryptfs.c b/cryptfs.c
index 3d0f30b..40a473f 100644
--- a/cryptfs.c
+++ b/cryptfs.c
@@ -2408,13 +2408,9 @@
return -1;
}
-int cryptfs_enable(char *howarg, char *passwd, int allow_reboot)
+int cryptfs_enable(char *howarg, int type, char *passwd, int allow_reboot)
{
- /** @todo If we keep this route (user selected encryption)
- * need to take a type in and pass it to here.
- */
- return cryptfs_enable_internal(howarg, CRYPT_TYPE_PASSWORD,
- passwd, allow_reboot);
+ return cryptfs_enable_internal(howarg, type, passwd, allow_reboot);
}
int cryptfs_enable_default(char *howarg, int allow_reboot)
diff --git a/cryptfs.h b/cryptfs.h
index 0e60d77..c95d2c2 100644
--- a/cryptfs.h
+++ b/cryptfs.h
@@ -162,7 +162,7 @@
int cryptfs_check_passwd(char *pw);
int cryptfs_verify_passwd(char *newpw);
int cryptfs_restart(void);
- int cryptfs_enable(char *flag, char *passwd, int allow_reboot);
+ int cryptfs_enable(char *flag, int type, char *passwd, int allow_reboot);
int cryptfs_changepw(int type, const char *newpw);
int cryptfs_enable_default(char *flag, int allow_reboot);
int cryptfs_setup_volume(const char *label, int major, int minor,