Correctly erase opal lr when luksFormat action fails.

This commit is contained in:
Ondrej Kozina
2023-10-27 11:14:57 +02:00
parent 800ec5d1ed
commit f15b2ffdec

View File

@@ -1420,7 +1420,8 @@ static int strcmp_or_null(const char *str, const char *expected)
int luksFormat(struct crypt_device **r_cd, char **r_password, size_t *r_passwordLen) int luksFormat(struct crypt_device **r_cd, char **r_password, size_t *r_passwordLen)
{ {
int r = -EINVAL, keysize, integrity_keysize = 0, fd, created = 0; bool wipe_signatures = false;
int encrypt_type, r = -EINVAL, keysize, integrity_keysize = 0, fd, created = 0;
struct stat st; struct stat st;
const char *header_device, *type; const char *header_device, *type;
char *msg = NULL, *key = NULL, *password = NULL; char *msg = NULL, *key = NULL, *password = NULL;
@@ -1629,7 +1630,7 @@ int luksFormat(struct crypt_device **r_cd, char **r_password, size_t *r_password
key, keysize, key, keysize,
password, passwordLen); password, passwordLen);
if (r < 0) { if (r < 0) {
(void) tools_wipe_all_signatures(header_device, true, false); wipe_signatures = true;
goto out; goto out;
} }
tools_keyslot_msg(r, CREATED); tools_keyslot_msg(r, CREATED);
@@ -1638,17 +1639,31 @@ int luksFormat(struct crypt_device **r_cd, char **r_password, size_t *r_password
strcmp_or_null(params2.integrity, "none")) strcmp_or_null(params2.integrity, "none"))
r = _wipe_data_device(cd); r = _wipe_data_device(cd);
out: out:
crypt_safe_free(key);
if (r < 0) {
encrypt_type = crypt_get_hw_encryption_type(cd);
if (encrypt_type == CRYPT_OPAL_HW_ONLY ||
encrypt_type == CRYPT_SW_AND_OPAL_HW) {
(void) crypt_wipe_hw_opal(cd, CRYPT_LUKS2_SEGMENT,
opal_params.admin_key, opal_params.admin_key_size,
0);
}
if (wipe_signatures)
(void) tools_wipe_all_signatures(header_device, true, false);
}
crypt_safe_free(CONST_CAST(void *)opal_params.admin_key);
if (r >= 0 && r_cd && r_password && r_passwordLen) { if (r >= 0 && r_cd && r_password && r_passwordLen) {
*r_cd = cd; *r_cd = cd;
*r_password = password; *r_password = password;
*r_passwordLen = passwordLen; *r_passwordLen = passwordLen;
} else { return r;
crypt_free(cd);
crypt_safe_free(password);
} }
crypt_safe_free(key); crypt_free(cd);
crypt_safe_free(CONST_CAST(void *)opal_params.admin_key); crypt_safe_free(password);
return r; return r;
} }