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,