Deactivate whole device TCRYPT tree if context is NULL
authorMilan Broz <gmazyland@gmail.com>
Sun, 17 Mar 2013 18:20:42 +0000 (19:20 +0100)
committerMilan Broz <gmazyland@gmail.com>
Sun, 17 Mar 2013 18:20:42 +0000 (19:20 +0100)
API (unfortunately) supports NULL argument for crypt_deactivate,
with new chained TCRYPT devices it must deactivate all
chained devices as well.

Fixes issue#147.

lib/setup.c
tests/api-test.c

index 86967fe..052c08c 100644 (file)
@@ -2138,6 +2138,7 @@ int crypt_activate_by_volume_key(struct crypt_device *cd,
 
 int crypt_deactivate(struct crypt_device *cd, const char *name)
 {
+       struct crypt_device *fake_cd = NULL;
        int r;
 
        if (!name)
@@ -2145,13 +2146,17 @@ int crypt_deactivate(struct crypt_device *cd, const char *name)
 
        log_dbg("Deactivating volume %s.", name);
 
-       if (!cd)
-               dm_backend_init();
+       if (!cd) {
+               r = crypt_init_by_name(&fake_cd, name);
+               if (r < 0)
+                       return r;
+               cd = fake_cd;
+       }
 
        switch (crypt_status(cd, name)) {
                case CRYPT_ACTIVE:
                case CRYPT_BUSY:
-                       if (cd && isTCRYPT(cd->type))
+                       if (isTCRYPT(cd->type))
                                r = TCRYPT_deactivate(cd, name);
                        else
                                r = dm_remove_device(cd, name, 0, 0);
@@ -2165,8 +2170,7 @@ int crypt_deactivate(struct crypt_device *cd, const char *name)
                        r = -EINVAL;
        }
 
-       if (!cd)
-               dm_backend_exit();
+       crypt_free(fake_cd);
 
        return r;
 }
index 15f95ed..f2478c6 100644 (file)
@@ -1752,6 +1752,7 @@ static void TcryptTest(void)
        };
        double enc_mbr = 0, dec_mbr = 0;
        const char *tcrypt_dev = "tcrypt-images/tck_5-sha512-xts-aes";
+       const char *tcrypt_dev2 = "tcrypt-images/tc_5-sha512-xts-serpent-twofish-aes";
        size_t key_size = 64;
        char key[key_size], key_def[key_size];
        const char *key_hex =
@@ -1821,6 +1822,18 @@ static void TcryptTest(void)
 
        OK_(crypt_deactivate(cd, CDEVICE_1));
        crypt_free(cd);
+
+       OK_(crypt_init(&cd, tcrypt_dev2));
+       params.keyfiles = NULL;
+       params.keyfiles_count = 0;
+       OK_(crypt_load(cd, CRYPT_TCRYPT, &params));
+       OK_(crypt_activate_by_volume_key(cd, CDEVICE_1, NULL, 0, CRYPT_ACTIVATE_READONLY));
+       crypt_free(cd);
+
+       // Deactivate the whole chain
+       EQ_(crypt_status(NULL, CDEVICE_1 "_1"), CRYPT_BUSY);
+       OK_(crypt_deactivate(NULL, CDEVICE_1));
+       EQ_(crypt_status(NULL, CDEVICE_1 "_1"), CRYPT_INACTIVE);
 }
 
 // Check that gcrypt is properly initialised in format