From 546564f91779812b0387d3a45590bf9d42001db4 Mon Sep 17 00:00:00 2001 From: Milan van Zanten Date: Thu, 7 May 2026 18:24:50 +0200 Subject: [PATCH] fix: xread fills remaining bytes with 0 as per contract --- src/vfs.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/vfs.rs b/src/vfs.rs index fa1105a..5dacf01 100644 --- a/src/vfs.rs +++ b/src/vfs.rs @@ -546,7 +546,14 @@ unsafe extern "C" fn x_read( let buf_len: usize = i_amt.try_into().map_err(|_| vars::SQLITE_IOERR_READ)?; let offset: usize = i_ofst.try_into().map_err(|_| vars::SQLITE_IOERR_READ)?; let buf = unsafe { slice::from_raw_parts_mut(buf.cast::(), buf_len) }; - vfs.read(&mut file.handle, offset, buf)?; + let bytes_read = vfs.read(&mut file.handle, offset, buf)?; + if bytes_read < buf_len { + // From https://sqlite.org/c3ref/io_methods.html: + // "If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill in the unread portions + // of the buffer with zeros." + buf[bytes_read..].fill(0); + return Err(vars::SQLITE_IOERR_SHORT_READ); + } Ok(vars::SQLITE_OK) }) }