From 7d6c5924174d19ea7e6c39d617d4bcefdc22d64d Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Wed, 13 Apr 2022 11:41:13 +0200 Subject: [PATCH] vfs/rump: handle split block I/O jobs This patch fixes a potential data corruption issue that could occur when issuing large I/O requests to vfs/rump, which don't fit into the default block I/O buffer of 128 KiB. Note that we haven't observed the problem in practice (Sculpt hosts vfs/rump in a dedicated vfs server, which fragments requests) but spotted the issue while reviewing the code. We could trigger problem by explicitly changing the I/O buffer size to 32 KiB. Issue #4474 --- repos/dde_rump/src/lib/rump/io.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/repos/dde_rump/src/lib/rump/io.cc b/repos/dde_rump/src/lib/rump/io.cc index 374dd8cdee..67b95f1e1f 100644 --- a/repos/dde_rump/src/lib/rump/io.cc +++ b/repos/dde_rump/src/lib/rump/io.cc @@ -121,16 +121,16 @@ class Backend struct Update_jobs_policy { - void produce_write_content(Job &job, Block::seek_off_t offset, + void produce_write_content(Job &job, off_t offset, char *dst, size_t length) { - Genode::memcpy(dst, job.ptr, length); + Genode::memcpy(dst, (char const *)job.ptr + offset, length); } - void consume_read_result(Job &job, Block::seek_off_t offset, + void consume_read_result(Job &job, off_t offset, char const *src, size_t length) { - Genode::memcpy(job.ptr, src, length); + Genode::memcpy((char *)job.ptr + offset, src, length); } void completed(Job &job, bool success)