sd_json_variant *w;
r = cryptsetup_get_token_as_json(cd, token, "systemd-tpm2", &v);
- if (IN_SET(r, -ENOENT, -EINVAL, -EMEDIUMTYPE))
+ if (ERRNO_IS_NEG_CRYPTSETUP_TOKEN_SKIP(r))
continue;
if (r < 0)
return log_error_errno(r, "Failed to read JSON token data off disk: %m");
for (int token = 0; token < sym_crypt_token_max(CRYPT_LUKS2); token++) {
r = cryptsetup_get_token_as_json(cd, token, "systemd-homed", NULL);
- if (IN_SET(r, -ENOENT, -EINVAL, -EMEDIUMTYPE))
+ if (ERRNO_IS_NEG_CRYPTSETUP_TOKEN_SKIP(r))
continue;
if (r < 0)
return log_error_errno(r, "Failed to read JSON token data off disk: %m");
int ks;
r = cryptsetup_get_token_as_json(cd, token, "systemd-pkcs11", &v);
- if (IN_SET(r, -ENOENT, -EINVAL, -EMEDIUMTYPE))
+ if (ERRNO_IS_NEG_CRYPTSETUP_TOKEN_SKIP(r))
continue;
if (r < 0)
return log_error_errno(r, "Failed to read JSON token data off disk: %m");
params = *(systemd_tpm2_plugin_params *)usrptr;
r = sd_json_parse(json, SD_JSON_PARSE_MUST_BE_OBJECT, &v, /* reterr_line= */ NULL, /* reterr_column= */ NULL);
+ if (r == -ENOMEM)
+ return r;
if (r < 0) {
/* Remap to -EPERM so libcryptsetup keeps iterating past a broken token. */
(void) crypt_log_debug_errno(cd, r, "Token %d: failed to parse JSON data: %m", token);
int ks;
r = cryptsetup_get_token_as_json(cd, token, "systemd-fido2", &v);
- if (IN_SET(r, -ENOENT, -EINVAL, -EMEDIUMTYPE))
+ if (ERRNO_IS_NEG_CRYPTSETUP_TOKEN_SKIP(r))
continue;
if (r < 0)
return log_error_errno(r, "Failed to read JSON token data off disk: %m");
CLEANUP_ARRAY(policy_hash, n_policy_hash, iovec_array_free);
r = cryptsetup_get_token_as_json(cd, token, "systemd-tpm2", &v);
- if (IN_SET(r, -ENOENT, -EINVAL, -EMEDIUMTYPE))
+ if (ERRNO_IS_NEG_CRYPTSETUP_TOKEN_SKIP(r))
continue;
if (r < 0)
return log_error_errno(r, "Failed to read JSON token data off disk: %m");
* -EINVAL → token index out of range or "type" field missing
* -ENOENT → token doesn't exist
* -EMEDIUMTYPE → "verify_type" specified and doesn't match token's type
+ * -EUCLEAN → token JSON data cannot be parsed
*/
r = sym_crypt_token_json_get(cd, idx, &text);
r = sd_json_parse(text, 0, &v, NULL, NULL);
if (r < 0)
- return r;
+ return r == -ENOMEM ? r : -EUCLEAN; /* Report unparseable token data in a single way for callers to skip */
if (verify_type) {
sd_json_variant *w;
int cryptsetup_set_minimal_pbkdf(struct crypt_device *cd);
int cryptsetup_get_token_as_json(struct crypt_device *cd, int idx, const char *verify_type, sd_json_variant **ret);
+/* Errors cryptsetup_get_token_as_json() returns for a token that is absent, of a different type, or
+ * unparseable, and callers should keep iterating other tokens. */
+#define ERRNO_IS_NEG_CRYPTSETUP_TOKEN_SKIP(r) IN_SET(r, -ENOENT, -EINVAL, -EMEDIUMTYPE, -EUCLEAN)
int cryptsetup_add_token_json(struct crypt_device *cd, sd_json_variant *v);
int cryptsetup_get_volume_key_prefix(struct crypt_device *cd, const char *volume_name, char **ret);
int cryptsetup_get_volume_key_id(struct crypt_device *cd, const char *volume_name, const void *volume_key,