From ab385252b5d45831dea8b819d9c5a1b0ac5b12dc Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sun, 10 May 2026 10:56:28 +0300 Subject: [PATCH] Add offset asserts before each write --- src/blockstore/v1/flush.cpp | 2 ++ src/blockstore/v1/journal.cpp | 1 + src/blockstore/v1/write.cpp | 11 +++++------ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/blockstore/v1/flush.cpp b/src/blockstore/v1/flush.cpp index 21a72c71..a2fc71ad 100644 --- a/src/blockstore/v1/flush.cpp +++ b/src/blockstore/v1/flush.cpp @@ -520,6 +520,7 @@ resume_2: await_sqe(15); data->iov = (struct iovec){ it->buf, (size_t)it->len }; data->callback = simple_callback_w; + assert(clean_loc+it->offset+it->len <= bs->dsk.block_count*bs->dsk.data_block_size); io_uring_prep_writev( sqe, bs->dsk.data_fd, &data->iov, 1, bs->dsk.data_offset + clean_loc + it->offset ); @@ -749,6 +750,7 @@ bool journal_flusher_co::write_meta_block(flusher_meta_write_t & meta_block, int await_sqe(0); data->iov = (struct iovec){ meta_block.buf, (size_t)bs->dsk.meta_block_size }; data->callback = simple_callback_w; + assert(bs->dsk.meta_block_size + meta_block.sector + bs->dsk.meta_block_size <= bs->dsk.meta_area_size); io_uring_prep_writev( sqe, bs->dsk.meta_fd, &data->iov, 1, bs->dsk.meta_offset + bs->dsk.meta_block_size + meta_block.sector ); diff --git a/src/blockstore/v1/journal.cpp b/src/blockstore/v1/journal.cpp index f0dcb1fc..300c8216 100644 --- a/src/blockstore/v1/journal.cpp +++ b/src/blockstore/v1/journal.cpp @@ -193,6 +193,7 @@ void blockstore_impl_t::prepare_journal_sector_write(int cur_sector, blockstore_ (size_t)journal.block_size }; data->callback = [this, flush_id = journal.submit_id](ring_data_t *data) { handle_journal_write(data, flush_id); }; + assert(journal.sector_info[cur_sector].offset+journal.block_size <= dsk.journal_len); io_uring_prep_writev( sqe, dsk.journal_fd, &data->iov, 1, journal.offset + journal.sector_info[cur_sector].offset ); diff --git a/src/blockstore/v1/write.cpp b/src/blockstore/v1/write.cpp index 448dfbfd..0e8b1920 100644 --- a/src/blockstore/v1/write.cpp +++ b/src/blockstore/v1/write.cpp @@ -368,9 +368,9 @@ int blockstore_impl_t::dequeue_write(blockstore_op_t *op) } data->iov.iov_len = op->len + stripe_offset + stripe_end; // to check it in the callback data->callback = [this, op](ring_data_t *data) { handle_write_event(data, op); }; - io_uring_prep_writev( - sqe, dsk.data_fd, PRIV(op)->iov_zerofill, vcnt, dsk.data_offset + (loc * dsk.data_block_size) + op->offset - stripe_offset - ); + const uint64_t write_offset = (loc * dsk.data_block_size) + op->offset - stripe_offset; + assert(write_offset+op->len+stripe_offset+stripe_end <= dsk.block_count*dsk.data_block_size); + io_uring_prep_writev(sqe, dsk.data_fd, PRIV(op)->iov_zerofill, vcnt, dsk.data_offset + write_offset); PRIV(op)->pending_ops = 1; if (!(dirty_it->second.state & BS_ST_INSTANT)) { @@ -495,9 +495,8 @@ int blockstore_impl_t::dequeue_write(blockstore_op_t *op) .op = op, }); data2->callback = [this, flush_id = journal.submit_id](ring_data_t *data) { handle_journal_write(data, flush_id); }; - io_uring_prep_writev( - sqe2, dsk.journal_fd, &data2->iov, 1, journal.offset + journal.next_free - ); + assert(journal.next_free+op->len <= dsk.journal_len); + io_uring_prep_writev(sqe2, dsk.journal_fd, &data2->iov, 1, journal.offset + journal.next_free); PRIV(op)->pending_ops++; } else