mirror of
https://gitlab.com/cryptsetup/cryptsetup.git
synced 2025-12-05 16:00:05 +01:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
38
lib/setup.c
38
lib/setup.c
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user