diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2024-03-02 04:58:57 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2024-03-09 09:05:03 +0000 |
commit | f7d51eb77e848a6f7823d98349ebabb6efce4e52 (patch) | |
tree | 5f711f5c6699a902415293d581f1d1ea721ef714 | |
parent | a0f02252c4175b5336c215cc7774c3ea08873476 (diff) | |
download | src-f7d51eb77e848a6f7823d98349ebabb6efce4e52.tar.gz src-f7d51eb77e848a6f7823d98349ebabb6efce4e52.zip |
getblkx(9): be more tolerant but also strict with the buffer size checks
PR: 277414
(cherry picked from commit 7e4ac11b6076e6a9bf7341ddeae22784284ed733)
-rw-r--r-- | sys/kern/vfs_bio.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 56f9d604b9eb..1b55c523c436 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -3980,9 +3980,11 @@ getblkx(struct vnode *vp, daddr_t blkno, daddr_t dblkno, int size, int slpflag, ("GB_KVAALLOC only makes sense with GB_UNMAPPED")); if (vp->v_type != VCHR) ASSERT_VOP_LOCKED(vp, "getblk"); - if (size > maxbcachebuf) - panic("getblk: size(%d) > maxbcachebuf(%d)\n", size, + if (size > maxbcachebuf) { + printf("getblkx: size(%d) > maxbcachebuf(%d)\n", size, maxbcachebuf); + return (EIO); + } if (!unmapped_buf_allowed) flags &= ~(GB_UNMAPPED | GB_KVAALLOC); @@ -4156,6 +4158,12 @@ newbuf_unlocked: vmio = vp->v_object != NULL; if (vmio) { maxsize = size + (offset & PAGE_MASK); + if (maxsize > maxbcachebuf) { + printf( + "getblkx: maxsize(%d) > maxbcachebuf(%d)\n", + maxsize, maxbcachebuf); + return (EIO); + } } else { maxsize = size; /* Do not allow non-VMIO notmapped buffers. */ |