Added AMDUAT_ASL_STORE_ERR_IO and used it in the FS store path so I/O/internal failures no longer surface as integrity errors; updated CLI/error mappings so the new error is visible and gets the IO exit code. This keeps integrity reserved for actual content/hash/collision issues while still preserving existing semantics for not-found/unsupported.

This commit is contained in:
Carl Niklas Rydberg 2025-12-21 22:59:31 +01:00
parent fe9acea94b
commit 24ad51ff46
7 changed files with 72 additions and 27 deletions

View file

@ -20,7 +20,8 @@ typedef enum {
AMDUAT_ASL_STORE_OK = 0,
AMDUAT_ASL_STORE_ERR_INTEGRITY = 1,
AMDUAT_ASL_STORE_ERR_UNSUPPORTED = 2,
AMDUAT_ASL_STORE_ERR_NOT_FOUND = 3
AMDUAT_ASL_STORE_ERR_NOT_FOUND = 3,
AMDUAT_ASL_STORE_ERR_IO = 4
} amduat_asl_store_error_t;
typedef struct {

View file

@ -35,7 +35,8 @@ typedef enum {
typedef enum {
AMDUAT_ASL_STORE_FS_READ_OK = 0,
AMDUAT_ASL_STORE_FS_READ_NOT_FOUND = 1,
AMDUAT_ASL_STORE_FS_READ_ERR = 2
AMDUAT_ASL_STORE_FS_READ_IO = 2,
AMDUAT_ASL_STORE_FS_READ_CORRUPT = 3
} amduat_asl_store_fs_read_status_t;
@ -196,7 +197,7 @@ static amduat_asl_store_fs_read_status_t amduat_asl_store_fs_read_file(
int fd;
if (path == NULL || out_bytes == NULL || out_size == NULL) {
return AMDUAT_ASL_STORE_FS_READ_ERR;
return AMDUAT_ASL_STORE_FS_READ_IO;
}
*out_bytes = NULL;
*out_size = 0;
@ -205,22 +206,22 @@ static amduat_asl_store_fs_read_status_t amduat_asl_store_fs_read_file(
if (errno == ENOENT || errno == ENOTDIR) {
return AMDUAT_ASL_STORE_FS_READ_NOT_FOUND;
}
return AMDUAT_ASL_STORE_FS_READ_ERR;
return AMDUAT_ASL_STORE_FS_READ_IO;
}
if (!S_ISREG(st.st_mode)) {
return AMDUAT_ASL_STORE_FS_READ_ERR;
return AMDUAT_ASL_STORE_FS_READ_CORRUPT;
}
if (st.st_size <= 0) {
return AMDUAT_ASL_STORE_FS_READ_ERR;
return AMDUAT_ASL_STORE_FS_READ_CORRUPT;
}
if ((uintmax_t)st.st_size > SIZE_MAX) {
return AMDUAT_ASL_STORE_FS_READ_ERR;
return AMDUAT_ASL_STORE_FS_READ_CORRUPT;
}
file_size = (size_t)st.st_size;
buffer = (uint8_t *)malloc(file_size);
if (buffer == NULL) {
return AMDUAT_ASL_STORE_FS_READ_ERR;
return AMDUAT_ASL_STORE_FS_READ_IO;
}
fd = open(path, O_RDONLY);
@ -229,7 +230,7 @@ static amduat_asl_store_fs_read_status_t amduat_asl_store_fs_read_file(
if (errno == ENOENT || errno == ENOTDIR) {
return AMDUAT_ASL_STORE_FS_READ_NOT_FOUND;
}
return AMDUAT_ASL_STORE_FS_READ_ERR;
return AMDUAT_ASL_STORE_FS_READ_IO;
}
total_read = 0u;
@ -241,19 +242,19 @@ static amduat_asl_store_fs_read_status_t amduat_asl_store_fs_read_file(
}
close(fd);
free(buffer);
return AMDUAT_ASL_STORE_FS_READ_ERR;
return AMDUAT_ASL_STORE_FS_READ_IO;
}
if (rc == 0) {
close(fd);
free(buffer);
return AMDUAT_ASL_STORE_FS_READ_ERR;
return AMDUAT_ASL_STORE_FS_READ_CORRUPT;
}
total_read += (size_t)rc;
}
if (close(fd) != 0) {
free(buffer);
return AMDUAT_ASL_STORE_FS_READ_ERR;
return AMDUAT_ASL_STORE_FS_READ_IO;
}
*out_bytes = buffer;
@ -277,9 +278,15 @@ static amduat_asl_store_error_t amduat_asl_store_fs_compare_existing(
if (read_status == AMDUAT_ASL_STORE_FS_READ_NOT_FOUND) {
return AMDUAT_ASL_STORE_ERR_NOT_FOUND;
}
if (read_status != AMDUAT_ASL_STORE_FS_READ_OK) {
if (read_status == AMDUAT_ASL_STORE_FS_READ_IO) {
return AMDUAT_ASL_STORE_ERR_IO;
}
if (read_status == AMDUAT_ASL_STORE_FS_READ_CORRUPT) {
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
}
if (read_status != AMDUAT_ASL_STORE_FS_READ_OK) {
return AMDUAT_ASL_STORE_ERR_IO;
}
if (stored_len != expected_len) {
free(stored_bytes);
@ -315,7 +322,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_put_impl(
bool wrote_new;
if (ctx == NULL || out_ref == NULL) {
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
return AMDUAT_ASL_STORE_ERR_IO;
}
fs = (amduat_asl_store_fs_t *)ctx;
@ -340,7 +347,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_put_impl(
&artifact_bytes)) {
amduat_octets_free(&artifact_bytes);
amduat_reference_free(&derived_ref);
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
return AMDUAT_ASL_STORE_ERR_IO;
}
objects_path = NULL;
@ -362,7 +369,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_put_impl(
if (!ok) {
amduat_octets_free(&artifact_bytes);
amduat_reference_free(&derived_ref);
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
return AMDUAT_ASL_STORE_ERR_IO;
}
if (!amduat_asl_store_fs_require_directory(fs->root_path) ||
@ -379,7 +386,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_put_impl(
free(level1_path);
free(level2_path);
free(object_path);
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
return AMDUAT_ASL_STORE_ERR_IO;
}
cmp_err = amduat_asl_store_fs_compare_existing(object_path,
@ -396,7 +403,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_put_impl(
free(object_path);
return AMDUAT_ASL_STORE_OK;
}
if (cmp_err == AMDUAT_ASL_STORE_ERR_INTEGRITY) {
if (cmp_err != AMDUAT_ASL_STORE_ERR_NOT_FOUND) {
amduat_octets_free(&artifact_bytes);
amduat_reference_free(&derived_ref);
free(objects_path);
@ -426,7 +433,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_put_impl(
free(level1_path);
free(level2_path);
free(object_path);
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
return cmp_err;
}
} else if (write_status != AMDUAT_ASL_STORE_FS_WRITE_OK) {
amduat_octets_free(&artifact_bytes);
@ -437,7 +444,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_put_impl(
free(level1_path);
free(level2_path);
free(object_path);
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
return AMDUAT_ASL_STORE_ERR_IO;
} else {
wrote_new = true;
}
@ -454,7 +461,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_put_impl(
free(level1_path);
free(level2_path);
free(object_path);
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
return AMDUAT_ASL_STORE_ERR_IO;
}
if (!amduat_asl_store_fs_fsync_directory(fs->root_path)) {
if (wrote_new) {
@ -468,7 +475,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_put_impl(
free(level1_path);
free(level2_path);
free(object_path);
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
return AMDUAT_ASL_STORE_ERR_IO;
}
*out_ref = derived_ref;
@ -502,7 +509,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_get_impl(
bool decoded;
if (ctx == NULL || out_artifact == NULL) {
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
return AMDUAT_ASL_STORE_ERR_IO;
}
fs = (amduat_asl_store_fs_t *)ctx;
@ -541,7 +548,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_get_impl(
&level1_path,
&level2_path,
&object_path)) {
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
return AMDUAT_ASL_STORE_ERR_IO;
}
stored_bytes = NULL;
@ -557,7 +564,16 @@ static amduat_asl_store_error_t amduat_asl_store_fs_get_impl(
free(object_path);
return AMDUAT_ASL_STORE_ERR_NOT_FOUND;
}
if (read_status != AMDUAT_ASL_STORE_FS_READ_OK) {
if (read_status == AMDUAT_ASL_STORE_FS_READ_IO) {
free(objects_path);
free(profile_path);
free(hash_path);
free(level1_path);
free(level2_path);
free(object_path);
return AMDUAT_ASL_STORE_ERR_IO;
}
if (read_status == AMDUAT_ASL_STORE_FS_READ_CORRUPT) {
free(objects_path);
free(profile_path);
free(hash_path);
@ -566,6 +582,15 @@ static amduat_asl_store_error_t amduat_asl_store_fs_get_impl(
free(object_path);
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
}
if (read_status != AMDUAT_ASL_STORE_FS_READ_OK) {
free(objects_path);
free(profile_path);
free(hash_path);
free(level1_path);
free(level2_path);
free(object_path);
return AMDUAT_ASL_STORE_ERR_IO;
}
computed_digest = (uint8_t *)malloc(hash_desc->digest_len);
if (computed_digest == NULL) {
@ -576,7 +601,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_get_impl(
free(level1_path);
free(level2_path);
free(object_path);
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
return AMDUAT_ASL_STORE_ERR_IO;
}
stored_octets = amduat_octets(stored_bytes, stored_len);
@ -592,7 +617,7 @@ static amduat_asl_store_error_t amduat_asl_store_fs_get_impl(
free(level1_path);
free(level2_path);
free(object_path);
return AMDUAT_ASL_STORE_ERR_INTEGRITY;
return AMDUAT_ASL_STORE_ERR_IO;
}
if (memcmp(computed_digest, ref.digest.data, hash_desc->digest_len) != 0) {

View file

@ -60,6 +60,9 @@ static bool amduat_store_error_map(amduat_asl_store_error_t err,
case AMDUAT_ASL_STORE_ERR_UNSUPPORTED:
*out_code = AMDUAT_PEL_STORE_ERROR_UNSUPPORTED;
return true;
case AMDUAT_ASL_STORE_ERR_IO:
*out_code = AMDUAT_PEL_STORE_ERROR_INTEGRITY;
return true;
default:
return false;
}

View file

@ -118,6 +118,8 @@ static const char *amduat_asl_cli_store_error_str(
return "unsupported";
case AMDUAT_ASL_STORE_ERR_INTEGRITY:
return "integrity";
case AMDUAT_ASL_STORE_ERR_IO:
return "io";
case AMDUAT_ASL_STORE_OK:
return "ok";
default:
@ -133,6 +135,8 @@ static int amduat_asl_cli_map_store_error(amduat_asl_store_error_t err) {
return AMDUAT_ASL_CLI_EXIT_UNSUPPORTED;
case AMDUAT_ASL_STORE_ERR_INTEGRITY:
return AMDUAT_ASL_CLI_EXIT_STORE;
case AMDUAT_ASL_STORE_ERR_IO:
return AMDUAT_ASL_CLI_EXIT_IO;
case AMDUAT_ASL_STORE_OK:
default:
return AMDUAT_ASL_CLI_EXIT_STORE;

View file

@ -153,6 +153,8 @@ static const char *amduat_pel_cli_store_error_str(
return "unsupported";
case AMDUAT_ASL_STORE_ERR_INTEGRITY:
return "integrity";
case AMDUAT_ASL_STORE_ERR_IO:
return "io";
case AMDUAT_ASL_STORE_OK:
return "ok";
default:
@ -168,6 +170,8 @@ static int amduat_pel_cli_map_store_error(amduat_asl_store_error_t err) {
return AMDUAT_PEL_CLI_EXIT_UNSUPPORTED;
case AMDUAT_ASL_STORE_ERR_INTEGRITY:
return AMDUAT_PEL_CLI_EXIT_STORE;
case AMDUAT_ASL_STORE_ERR_IO:
return AMDUAT_PEL_CLI_EXIT_IO;
case AMDUAT_ASL_STORE_OK:
default:
return AMDUAT_PEL_CLI_EXIT_STORE;

View file

@ -66,6 +66,8 @@ static const char *amduat_pel_run_store_error_str(
return "unsupported";
case AMDUAT_ASL_STORE_ERR_INTEGRITY:
return "integrity";
case AMDUAT_ASL_STORE_ERR_IO:
return "io";
case AMDUAT_ASL_STORE_OK:
return "ok";
default:
@ -81,6 +83,8 @@ static int amduat_pel_run_map_store_error(amduat_asl_store_error_t err) {
return AMDUAT_PEL_RUN_EXIT_UNSUPPORTED;
case AMDUAT_ASL_STORE_ERR_INTEGRITY:
return AMDUAT_PEL_RUN_EXIT_STORE;
case AMDUAT_ASL_STORE_ERR_IO:
return AMDUAT_PEL_RUN_EXIT_IO;
case AMDUAT_ASL_STORE_OK:
default:
return AMDUAT_PEL_RUN_EXIT_STORE;

View file

@ -144,6 +144,8 @@ static const char *amduat_pel_seed_store_error_str(
return "unsupported";
case AMDUAT_ASL_STORE_ERR_INTEGRITY:
return "integrity";
case AMDUAT_ASL_STORE_ERR_IO:
return "io";
case AMDUAT_ASL_STORE_OK:
return "ok";
default:
@ -159,6 +161,8 @@ static int amduat_pel_seed_map_store_error(amduat_asl_store_error_t err) {
return AMDUAT_PEL_SEED_EXIT_UNSUPPORTED;
case AMDUAT_ASL_STORE_ERR_INTEGRITY:
return AMDUAT_PEL_SEED_EXIT_STORE;
case AMDUAT_ASL_STORE_ERR_IO:
return AMDUAT_PEL_SEED_EXIT_IO;
case AMDUAT_ASL_STORE_OK:
default:
return AMDUAT_PEL_SEED_EXIT_STORE;