Skip to content

Commit 85f56a2

Browse files
committed
Add RAF header/backing-size consistency check on open
1 parent b6ab782 commit 85f56a2

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

src/raf/raf_variant.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,9 @@ FN(open)(CTX_TYPE *ctx, const aegis_raf_io *io, const aegis_raf_rng *rng,
418418
{
419419
aegis_raf_ctx_internal *internal;
420420
uint64_t backing_size;
421+
uint64_t backing_needed;
422+
uint64_t max_chunks;
423+
uint64_t rec_size;
421424
uint8_t hdr[AEGIS_RAF_HEADER_SIZE];
422425

423426
if (io == NULL || rng == NULL || cfg == NULL || master_key == NULL) {
@@ -469,6 +472,20 @@ FN(open)(CTX_TYPE *ctx, const aegis_raf_io *io, const aegis_raf_rng *rng,
469472
memset(internal, 0, sizeof(aegis_raf_ctx_internal));
470473
return -1;
471474
}
475+
rec_size = (uint64_t) record_size(internal->chunk_size);
476+
max_chunks = get_chunk_count(internal->chunk_size, internal->file_size);
477+
if (max_chunks != 0 &&
478+
max_chunks > (UINT64_MAX - AEGIS_RAF_HEADER_SIZE) / rec_size) {
479+
errno = EOVERFLOW;
480+
memset(internal, 0, sizeof(aegis_raf_ctx_internal));
481+
return -1;
482+
}
483+
backing_needed = AEGIS_RAF_HEADER_SIZE + max_chunks * rec_size;
484+
if (backing_size < backing_needed) {
485+
errno = EINVAL;
486+
memset(internal, 0, sizeof(aegis_raf_ctx_internal));
487+
return -1;
488+
}
472489

473490
if (setup_scratch_buffers(internal, cfg->scratch) != 0) {
474491
memset(internal, 0, sizeof(aegis_raf_ctx_internal));

0 commit comments

Comments
 (0)