Skip to content

Commit a2d3153

Browse files
Ming Leikawasaki
authored andcommitted
ublk: use unchecked copy helpers for bio page data
Bio pages may originate from slab caches that lack a usercopy region (e.g. jbd2 frozen metadata buffers allocated via jbd2_alloc()). When CONFIG_HARDENED_USERCOPY is enabled, copy_to_iter() calls check_copy_size() which rejects these slab pages, triggering a kernel BUG in usercopy_abort(). This is a false positive: the data is ordinary block I/O content — the same data the loop driver writes to its backing file via vfs_iter_write(). The bvec length is always trusted, so the size check in check_copy_size() is not needed either. Switch to _copy_to_iter()/_copy_from_iter() which skip the check_copy_size() wrapper while the underlying copy_to_user() remains unchanged. Acked-by: Caleb Sander Mateos <[email protected]> Fixes: 2299cee ("ublk: use copy_{to,from}_iter() for user copy") Signed-off-by: Ming Lei <[email protected]>
1 parent 6a0b974 commit a2d3153

1 file changed

Lines changed: 10 additions & 2 deletions

File tree

drivers/block/ublk_drv.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1319,10 +1319,18 @@ static bool ublk_copy_user_bvec(const struct bio_vec *bv, unsigned *offset,
13191319

13201320
len = bv->bv_len - *offset;
13211321
bv_buf = kmap_local_page(bv->bv_page) + bv->bv_offset + *offset;
1322+
/*
1323+
* Bio pages may originate from slab caches without a usercopy region
1324+
* (e.g. jbd2 frozen metadata buffers). This is the same data that
1325+
* the loop driver writes to its backing file — no exposure risk.
1326+
* The bvec length is always trusted, so the size check in
1327+
* check_copy_size() is not needed either. Use the unchecked
1328+
* helpers to avoid false positives on slab pages.
1329+
*/
13221330
if (dir == ITER_DEST)
1323-
copied = copy_to_iter(bv_buf, len, uiter);
1331+
copied = _copy_to_iter(bv_buf, len, uiter);
13241332
else
1325-
copied = copy_from_iter(bv_buf, len, uiter);
1333+
copied = _copy_from_iter(bv_buf, len, uiter);
13261334

13271335
kunmap_local(bv_buf);
13281336

0 commit comments

Comments
 (0)