Fix memory leaks in integrity resize with keyed parameters.

The whole game with reallocating keys is not needed.

(Perhaps not even for crypt type, but that is not part of this patch).
This commit is contained in:
Milan Broz
2022-04-17 21:14:24 +02:00
parent 4cdcd908f4
commit f391f4baf1
2 changed files with 12 additions and 57 deletions

View File

@@ -300,28 +300,21 @@ int INTEGRITY_activate(struct crypt_device *cd,
if (r < 0)
return r;
if (!vk)
MOVE_REF(vk, dmdq.segment.u.integrity.vk);
if (!journal_mac_key)
MOVE_REF(journal_mac_key, dmdq.segment.u.integrity.journal_integrity_key);
if (!journal_crypt_key)
MOVE_REF(journal_crypt_key, dmdq.segment.u.integrity.journal_crypt_key);
dm_targets_free(cd, &dmdq);
}
r = INTEGRITY_create_dmd_device(cd, params, vk ?: dmdq.segment.u.integrity.vk,
journal_crypt_key ?: dmdq.segment.u.integrity.journal_crypt_key,
journal_mac_key ?: dmdq.segment.u.integrity.journal_integrity_key,
&dmd, flags, sb_flags);
if (!r)
dmd.size = dmdq.size;
} else
r = INTEGRITY_create_dmd_device(cd, params, vk, journal_crypt_key,
journal_mac_key, &dmd, flags, sb_flags);
if (flags & CRYPT_ACTIVATE_REFRESH)
dmd.size = dmdq.size;
if (r < 0)
return r;
if (!r)
r = INTEGRITY_activate_dmd_device(cd, name, CRYPT_INTEGRITY, &dmd, sb_flags);
dm_targets_free(cd, &dmdq);
dm_targets_free(cd, &dmd);
return r;
}

View File

@@ -2632,44 +2632,6 @@ static int _reload_device(struct crypt_device *cd, const char *name,
r = -ENOMEM;
goto out;
}
} else if (tgt->type == DM_INTEGRITY) {
crypt_free_volume_key(tgt->u.integrity.vk);
tgt->u.integrity.vk = NULL;
if (src->u.integrity.vk) {
tgt->u.integrity.vk = crypt_alloc_volume_key(src->u.integrity.vk->keylength,
src->u.integrity.vk->key);
if (!tgt->u.integrity.vk) {
r = -ENOMEM;
goto out;
}
}
crypt_free_volume_key(tgt->u.integrity.journal_integrity_key);
tgt->u.integrity.journal_integrity_key = NULL;
if (src->u.integrity.journal_integrity_key) {
tgt->u.integrity.journal_integrity_key =
crypt_alloc_volume_key(src->u.integrity.journal_integrity_key->keylength,
src->u.integrity.journal_integrity_key->key);
if (!tgt->u.integrity.journal_integrity_key) {
r = -ENOMEM;
goto out;
}
}
crypt_free_volume_key(tgt->u.integrity.journal_crypt_key);
tgt->u.integrity.journal_crypt_key = NULL;
if (src->u.integrity.journal_crypt_key) {
tgt->u.integrity.journal_crypt_key =
crypt_alloc_volume_key(src->u.integrity.journal_crypt_key->keylength,
src->u.integrity.journal_crypt_key->key);
if (!tgt->u.integrity.journal_crypt_key) {
r = -ENOMEM;
goto out;
}
}
}
if (tgt->type == DM_CRYPT)