Re: [PATCH RESEND 5/5] block: validate user space vectors during extraction
Shin'ichiro Kawasaki <[email protected]> Thu, 6 Aug 2026 17:03:53 +0900
| Newsgroups | dev.linux.lists.dm-devel,org.kernel.vger.linux-block,org.kernel.vger.linux-fsdevel,org.kernel.vger.stable |
|---|---|
| Message-ID | <anQ-28nxOqBmQjxu@shinmob> |
On Aug 05, 2026 / 21:46, Shin'ichiro Kawasaki wrote: > Cc+: 0wnerD1ed > > On Jul 20, 2026 / 13:10, Keith Busch wrote: > > From: Keith Busch <[email protected]> > > > > The bio-based drivers don't necessarily check the alignment split, and > > stacking block drivers don't always handle a misalignment detected after > > submitting the bio. Validate user vectors against the device's > > dma_alignment as the bio is built from the iov_iter, rejecting > > misaligned early with -EINVAL. > > Recently, the new test case block/045 was added to blkests through a GitHub PR > [1]. The test case passes with the Linux master branch tags v7.2-rcX. Today, I > found that it fails with block/for-next branch tip [2]. I bisected and found > that this patch triggers the failure. > > 0wnerDied, Keith, may I ask your help to resolve the failure? I'm guessing > the test case needs to care device's dma alignment, but not so sure. I took a closer look. I modified the test case to respect the dma alignment [*], and now the test case passes. This approach looks working. Will post the change as a formal patch for review. [*] fix trial patch for blktests diff --git a/src/bio-full-trim.c b/src/bio-full-trim.c index e304b2c..7cea3f9 100644 --- a/src/bio-full-trim.c +++ b/src/bio-full-trim.c @@ -12,20 +12,38 @@ #include <sys/mman.h> #include <unistd.h> +int msb(unsigned int v) +{ + unsigned int b = 0; + + while (v >>= 1) + b++; + + return b; +} + int main(int argc, char **argv) { unsigned int block_size; unsigned char *p; long page_size; + unsigned int dma_alignment; + unsigned int dma_aligned_offset; ssize_t ret; int fd; - if (argc != 2) + if (argc != 3) return EXIT_FAILURE; + page_size = sysconf(_SC_PAGESIZE); if (page_size <= 0) errx(EXIT_FAILURE, "invalid page size"); + dma_alignment = atoi(argv[2]); + dma_aligned_offset = 1 << (msb(dma_alignment) + 1); + if (dma_aligned_offset >= page_size) + err(EXIT_FAILURE, "unexpected dma_alignment"); + fd = open(argv[1], O_RDONLY | O_DIRECT); if (fd < 0) err(EXIT_FAILURE, "open %s", argv[1]); @@ -40,7 +58,7 @@ int main(int argc, char **argv) err(EXIT_FAILURE, "mprotect"); errno = 0; - ret = pread(fd, p + page_size - 1, block_size, 0); + ret = pread(fd, p + page_size - dma_aligned_offset, block_size, 0); if (ret == -1 && errno == EFAULT) return EXIT_SUCCESS; errx(EXIT_FAILURE, "pread returned %zd (errno %d)", ret, errno); diff --git a/tests/block/045 b/tests/block/045 index 65bfcb9..6e112b6 100755 --- a/tests/block/045 +++ b/tests/block/045 @@ -25,7 +25,8 @@ test() { return 1 fi - if ! src/bio-full-trim /dev/nullb1; then + if ! src/bio-full-trim /dev/nullb1 \ + $(< /sys/block/nullb1/queue/dma_alignment); then echo "bio-full-trim helper failed" fi -- 2.55.0